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를 이용하시면 됩니다.