[swift] 에러 핸들링을 위한 기본 라이브러리 함수 사용 방법

Swift에서 에러를 처리하는 것은 안전성을 유지하는데 매우 중요합니다. 이 글에서는 Swift의 기본 라이브러리 함수를 사용하여 에러를 처리하는 방법에 대해 알아보겠습니다.

1. 기본적인 에러 핸들링

Swift에서 기본적인 에러 핸들링은 do-catch 구문을 사용합니다.

func divide(_ a: Int, by b: Int) throws -> Int {
    guard b != 0 else {
        throw DivisionError.divideByZero
    }
    return a / b
}

do {
    let result = try divide(10, by: 2)
    print(result)
} catch {
    print("에러 발생: \(error)")
}

위의 예제에서 divide 함수는 두 개의 정수를 나누며, 두 번째 매개변수가 0인 경우 DivisionError.divideByZero 에러를 던집니다. 함수를 호출할 때는 try 키워드를 사용하여 에러가 발생할 수 있음을 명시해주어야 합니다.

2. 에러 타입 정의

에러를 처리할 때는 사용자 정의 에러 타입을 정의하는 것이 좋습니다.

enum FileError: Error {
    case notFound
    case permissionDenied
}

func readFile(atPath path: String) throws {
    if !FileManager.default.fileExists(atPath: path) {
        throw FileError.notFound
    }
    else if !FileManager.default.isReadableFile(atPath: path) {
        throw FileError.permissionDenied
    }
    // 파일 읽는 로직
}

do {
    try readFile(atPath: "/path/to/file.txt")
} catch {
    print("에러 발생: \(error)")
}

위의 예제에서 FileError는 파일 관련 에러를 다루기 위한 사용자 정의 에러 타입입니다.

3. 옵셔널 값을 다루는 함수

기본 라이브러리에서 제공하는 함수들은 옵셔널 값을 다루는 데 유용합니다.

let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
guard let number = convertedNumber else {
    print("변환에 실패했습니다.")
    return
}
// number를 활용한 로직

Int의 이니셜라이저는 문자열을 숫자로 변환해줍니다. 그 결과가 옵셔널인 이유는 변환이 실패할 수도 있기 때문입니다.

Swift의 기본 라이브러리 함수를 적절히 활용하면 안전하고 효율적인 에러 핸들링을 구현할 수 있습니다.

이상으로 Swift 에러 핸들링에 대한 기본 라이브러리 함수의 사용 방법에 대해 알아보았습니다. 부가적인 내용들은 Swift 공식 문서에서 확인할 수 있습니다.

## BONUS

에러 핸들링에 있어서 `defer` 키워드를 사용하여 정리 코드를 작성하는 것도 유용할 수 있습니다. 
```swift
func processFile(filename: String) throws {
    let file = open(filename)
    defer {
        close(file)
    }
    // 파일 처리 로직
}