Swift Error Handling(에러 핸들링) 하는 방법

Swift의 Error Handling(에러 핸들링) 하는 방법을 배워보세요.


Swift Error Handling(에러 핸들링) 하는 방법

Swift에서 Error Handling은 예외 처리를 위한 메커니즘입니다. 예외는 프로그램에서 예상치 못한 상황이 발생했을 때 발생하는 오류를 의미합니다.

1. Swift에서 Error Handling 정의 하는 방법

Swift에서는 에러를 Error 프로토콜을 준수하는 열거형으로 정의합니다. 네트워크 요청 중 발생할 수 있는 다양한 상황을 다음과 같이 표현할 수 있습니다.

enum NetworkError: Error {
    case badURL
    case requestFailed
    case noData
    case decodingError
}

각 케이스는 발생할 수 있는 네트워크 관련 에러 상황을 나타냅니다:

  • badURL: URL이 잘못되었을 때.
  • requestFailed: 네트워크 요청이 실패했을 때.
  • noData: 데이터가 반환되지 않았을 때.
  • decodingError: 데이터를 디코딩할 수 없을 때.

2. 에러를 발생시키는 함수

throws 키워드를 사용하면 함수에서 에러를 던질 수 있습니다.

func fetchData(from url: String) throws -> Data {
    // URL 유효성 검증
    guard let validURL = URL(string: url) else {
        throw NetworkError.badURL
    }
 
    print("URL 요청: \(validURL)")
 
    // 요청 성공 여부를 랜덤으로 시뮬레이션
    let success = Bool.random()
    if !success {
        throw NetworkError.requestFailed
    }
 
    // 요청 성공 시 더미 데이터 반환
    return Data("서버로부터 받은 데이터".utf8)
}
 
  • URL 유효성 검증: URL(string:)을 통해 URL이 유효하지 않으면 NetworkError.badURL를 던집니다.
  • 네트워크 요청 시뮬레이션: Bool.random()으로 요청 성공 여부를 랜덤하게 결정합니다.
  • 더미 데이터 반환: 요청이 성공하면 데이터를 반환합니다.

3. 에러 처리: do-catch 구문

에러를 처리하려면 do-catch 블록을 사용해야 합니다. try 키워드를 사용해 에러를 발생시킬 수 있는 함수를 호출하고, 발생한 에러를 catch 블록에서 처리합니다.

do {
    let data = try fetchData(from: "https://api.example.com/data")
    print("데이터를 성공적으로 가져왔습니다: \(String(data: data, encoding: .utf8) ?? "데이터 변환 실패")")
} catch NetworkError.badURL {
    print("잘못된 URL입니다.")
} catch NetworkError.requestFailed {
    print("네트워크 요청이 실패했습니다.")
} catch NetworkError.noData {
    print("데이터를 받을 수 없습니다.")
} catch NetworkError.decodingError {
    print("데이터 디코딩에 실패했습니다.")
} catch {
    print("알 수 없는 에러가 발생했습니다: \(error)")
}

4. 옵셔널 try? 와 강제 try!

try?와 try!는 에러 처리의 간소화 및 강제 실행을 위해 제공된니다.

  • try? : 에러가 발생하면 nil을 반환하여 에러를 무시할 수 있습니다.
let data = try? fetchData(from: "https://invalidurl.com")
print(data ?? "데이터를 가져올 수 없습니다.")
  • try! : 에러가 발생하지 않을 것이라고 확신할 때 사용합니다. 하지만 에러가 발생하면 런타임 크래시가 발생합니다.
let data = try! fetchData(from: "https://api.example.com/data")
print(data)