카테고리 없음
Swift) do catch
나태한개발
2024. 6. 15. 22:42
오류 처리의 기본 개념
스위프트에서 오류는 Error 프로토콜을 준수하는 타입으로 표현된다. 오류를 처리하는 기본 과정은 오류를 던지는 것과 던져진 오류를 잡는 것으로 나눌 수 있다.
오류 던지기
오류를 던지는 함수는 throws 키워드를 사용하여 정의한다.
enum FileError: Error {
case fileNotFound
case unreadable
case encodingFailed
}
func readFile(at path: String) throws -> String {
// 예제 코드로 파일이 없다고 가정
throw FileError.fileNotFound
}
위 예제에서 readFile 함수는 파일을 읽다가 발생할 수 있는 오류를 던질 수 있다.
오류 잡기
오류를 잡으려면 do-catch 구문을 사용한다. do 블록 안에서 오류를 던질 수 있는 코드를 작성하고, catch 블록에서 발생한 오류를 처리한다.
do {
let fileContents = try readFile(at: "path/to/file")
print(fileContents)
} catch FileError.fileNotFound {
print("파일을 찾을 수 없습니다.")
} catch FileError.unreadable {
print("파일을 읽을 수 없습니다.")
} catch FileError.encodingFailed {
print("파일 인코딩에 실패했습니다.")
} catch {
print("알 수 없는 오류가 발생했습니다: \(error)")
}
위 코드에서 try 키워드를 사용하여 오류를 던질 수 있는 함수 readFile을 호출한다. 발생한 오류는 catch 블록에서 처리된다.
오류 전파
오류를 직접 처리하지 않고 호출한 함수로 전파할 수도 있다. 이를 위해 throws 키워드를 사용하여 오류를 전파할 수 있다.
func processFile(at path: String) throws {
let fileContents = try readFile(at: path)
print(fileContents)
}
do {
try processFile(at: "path/to/file")
} catch {
print("파일 처리 중 오류가 발생했습니다: \(error)")
}
try?와 try!
오류를 옵셔널(Optional) 값으로 처리하거나, 오류가 발생하지 않을 것이라고 확신하는 경우 try?와 try!를 사용할 수 있다.
- try?: 오류가 발생하면 nil을 반환한다.
- try!: 오류가 발생하지 않을 것이라고 확신할 때 사용하며, 오류가 발생하면 런타임 오류가 발생한다.
let fileContents1 = try? readFile(at: "path/to/file") // fileContents1은 String? 타입
let fileContents2 = try! readFile(at: "path/to/file") // 오류가 발생하지 않을 것을 확신할 때 사용
rethrows
함수가 인자로 오류를 던질 수 있는 클로저를 받을 때, 자신은 새로운 오류를 던지지 않지만 받은 클로저가 던진 오류를 전파할 수 있게 하려면 rethrows 키워드를 사용할 수 있다.
func performTask(with action: () throws -> Void) rethrows {
try action()
}
do {
try performTask {
throw FileError.fileNotFound
}
} catch {
print("작업 중 오류가 발생했습니다: \(error)")
}