Programming/Swift(iOS)

Swift 오류 처리 - 1

홍열 2021. 4. 6. 09:38
728x90

Swift에는 오류를 처리할 수 있는 방법들이 많이 있습니다. 

Error Protocol을 구현해주면 되는데요. 

 

에러는 상호 베타적이기때문에, 한 에러가 발생하면 다른 에러는 발생하지 않아야합니다. 

-> Enum을 가지고 구현하면 편합니다. 

 

추가적인 정보가 필요한 경우에는 struct나 class도 가능합니다. 

 

에러에 대한 정보는 함수 위에 미리 넣어주는게 좋습니다. (Command + option + /)

enum ParseLocationError:Error {
    case invalidData
    case network(String)
    case locationDoesNotExist
}

struct Location {
    let latitude:Double
    let longitude:Double
}


/// 유요한 위치인지 확인
/// - Parameters:
///   - latitude: 위도
///   - longitude: 경도
/// - Throws: 유효하지 않은 데이터인 경우, invalidData를 발생시킵니다.
/// - Returns: Location
func parseLocation(_ latitude:String, _ longitude:String) throws -> Location {
    guard let latitude = Double(latitude), let longitude = Double(longitude) else {
        throw ParseLocationError.invalidData
    }
    
    return Location(latitude: latitude, longitude: longitude)
}

 

parseLocation은 에러가 발생하면 throws를 통해서 ParseLocationError을 던지도록 되어 있습니다.

 

throws를 받으려면 어떻게 해야될까요?

 

1. try funtion() 

-> error가 발생하면 프로그램이 비정상종료됩니다.

try parseLocation("a", "b")

2. do ~ catch

-> error가 catch block에 전달되므로 처리가 가능합니다. 

catch에는 error의 최상위 타입이 전달됩니다. 따라서 switch로 구분하고, 우리가 정의한 Error이외의 Error가 더 올수 있으므로 항상 default를 같이 표시해줍니다. 

do {
    let loc:Location = try parseLocation("A", "23.23")
} catch let error{
    print(error)
}

do {
    let location = try parseLocation("A", "4.5")
    print(location)
} catch {
    print(error)
    switch error {
    case ParseLocationError.invalidData:
        print("invalidData")
    case ParseLocationError.network(let message):
        print("netword = \(message)")
    case ParseLocationError.locationDoesNotExist:
        print("locationDoesNotExit")
    default:
        print("another error")
    }
}

// catch에서 에러의 종류로 직접 처리 가능하다.
do {
    let location = try parseLocation("A", "4.5")
    print(location)
} catch ParseLocationError.invalidData {
    print("invalidData")

} catch ParseLocationError.network(let message) {
    print("netword = \(message)")
} catch ParseLocationError.locationDoesNotExist {
    print("locationDoesNotExit")
} catch {
    print("another error")
}

//에러의 타입을 기반으로 다른 처리를 하는것도 가능하다.

do {
    let location = try parseLocation("A", "4.5")
    print(location)
} catch let error as ParseLocationError {
    print(error)
} catch {
    print(error)
}

 

만약 error가 발생했을 때, 처리하고 싶은 부분이 있으면 어떻게 해야될까요?

java에서 finally같은 역할이 swift에도 있을까요?

 

-> defer를 이용하시면 됩니다.