카테고리 없음

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)")
}