IOS개발: SWIFT/5. 고급 주제 탐구

Swift 예외 처리:do-catch 문, throw, rethrows

_Blue_Sky_ 2024. 9. 13. 15:44
728x90
728x90

Swift 예외 처리: do-catch 문, throw, rethrows 자세히 알아보기

Swift에서 예외 처리(Error Handling)는 프로그램의 안정성을 높이고 예상치 못한 상황에 대한 대처 능력을 향상시키는 데 필수적인 요소입니다. do-catch 문, throw, rethrows 키워드는 이러한 예외 처리를 구현하는 데 사용되는 주요 도구입니다.

1. throw 키워드: 오류 던지기

  • 함수에서 오류 발생 시키기: 특정 조건에서 오류가 발생하면 throw 키워드를 사용하여 오류를 던질 수 있습니다. 던지는 오류는 Error 프로토콜을 준수하는 타입이어야 합니다.
  • 함수 선언: 오류를 던질 수 있는 함수는 throws 키워드를 함수 선언에 추가하여 명시해야 합니다.
enum DivisionError: Error {
    case dividedByZero
}

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

2. do-catch 문: 오류 처리

  • 오류 포착: do-catch 문을 사용하여 throw로 던져진 오류를 포착하고 처리할 수 있습니다.
  • 구조:
    do {
        // 오류가 발생할 수 있는 코드
    } catch 오류타입 {
        // 오류 발생 시 실행될 코드
    }
    
     
     
do {
    let result = try divide(10, by: 0)
    print(result)
} catch DivisionError.dividedByZero {
    print("0으로 나눌 수 없습니다.")
} catch {
    print("알 수 없는 오류 발생")
}
 
 

3. rethrows 키워드: 오류 재전달

  • 함수 내부에서 발생한 오류 전달: 다른 함수를 호출하는 함수에서 그 함수가 throws를 선언했을 경우, 호출한 함수에서도 throws를 선언하고 rethrows 키워드를 사용하여 오류를 재전달할 수 있습니다.
  • 오류 처리 위임: 내부 함수에서 발생한 오류를 외부로 전달하여 상위 함수에서 처리하도록 합니다.
func processData(_ data: Data) throws -> String {
    guard let jsonString = String(data: data, encoding: .utf8) else {
        throw NSError(domain: "DataError", code: -1, userInfo: nil)
    }
    
    // JSON 파싱 로직 (오류 발생 가능)
    let jsonData = try JSONSerialization.jsonObject(with: data) as? [String: Any]
    guard let result = jsonData?["result"] as? String else {
        throw NSError(domain: "JSONError", code: -2, userInfo: nil)
    }
    
    return result
}
 

예외 처리 시 고려 사항

  • Custom Error: 프로젝트에 맞는 커스텀 에러 타입을 정의하여 더욱 명확한 오류 처리를 할 수 있습니다.
  • defer 키워드: do-catch 블록에서 오류 발생 여부와 상관없이 항상 실행해야 하는 코드를 defer 블록에 작성할 수 있습니다. 예를 들어, 파일 닫기, 리소스 해제 등을 수행하는 코드를 작성할 수 있습니다.
  • Optional Binding: 옵셔널 값을 언래핑할 때 if let 또는 guard let을 사용하여 nil 값에 대한 처리를 할 수 있습니다.
  • Error Propagation: 오류를 최상위 레벨까지 전파하여 프로그램이 비정상적으로 종료되는 것을 방지합니다.

결론

Swift의 예외 처리는 do-catch, throw, rethrows 키워드를 통해 안전하고 강력하게 구현할 수 있습니다. 이를 통해 프로그램의 안정성을 높이고 예상치 못한 상황에 대한 대처 능력을 향상시킬 수 있습니다.

주의:

  • 과도한 예외 처리: 모든 상황에서 예외 처리를 사용하는 것은 오히려 코드를 복잡하게 만들 수 있습니다. 필요한 경우에만 예외 처리를 사용해야 합니다.
  • 명확한 오류 메시지: 사용자에게 유용한 정보를 제공하기 위해 명확하고 자세한 오류 메시지를 작성해야 합니다.
728x90
728x90