-
Swift 오류처리 - 3Programming/Swift(iOS) 2021. 4. 6. 11:22728x90
Objective - C의 전통적인 에러 처리인 'NSError'를 이용한 방법입니다.
NSError를 extension으로 구현 한 뒤에, 각 종 처리를 추가해주면 됩니다.
enum ApiError: Error { case network(String) case client(String) case server } struct User { let login: String let company: String } extension ApiError { var nsError: NSError { return NSError(apiError: self) } } func getGithubUser(login: String) throws -> User { if login == "root" { // throw ApiError.client("Invalid login name") // throw NSError(domain: "MyDomain", code: 100, userInfo: ["hello":"Tom"]) // throw NSError(apiError: ApiError.client("Invalid login name")) throw ApiError.client("Invalid login name").nsError } return User(login: login, company: "LG") } // 현재 버전 // - Error가 NSError 타입이어야 한다. do { let user = try getGithubUser(login: "root") print(user) } catch { // NSError: Obj-C에서 다루는 Error 타입 // => NSError 가 출력되는 형식을 변경해야 합니다. print(error) } // 예전 버전 #if false do { let user = try getGithubUser(login: "root") print(user) } catch let error as NSError { print(error) } #endif /// A localized message describing what error occurred. // var errorDescription: String? { get } // 1. 오류를 출력할 때 추가적인 정보를 제공할 수 있습니다. extension ApiError: LocalizedError { var errorDescription: String? { switch self { case .network(let message): return "errorDescription: network(\(message))" case .client(let message): return "errorDescription: client(\(message))" case .server: return "errorDescription: server" } } var failureReason: String? { switch self { case .network: return "failureReason: 네트워크 오류 입니다" case .client: return "failureReason: 클라이언트가 잘못했습니다." case .server: return "failureReason: 서버가 잘못했습니다." } } var recoverySuggestion: String? { return "재부팅하세요" } } // 2. NSError가 출력되는 형식을 지정할 수 있습니다. extension ApiError: CustomNSError { static var errorDomain: String { return "ApiError" } var errorCode: Int { switch self { case .network: return 100 case .client: return 400 case .server: return 500 } } var errorUserInfo: [String: Any] { return [ NSLocalizedDescriptionKey: errorDescription ?? "", NSLocalizedFailureErrorKey: failureReason ?? "", NSLocalizedRecoverySuggestionErrorKey: recoverySuggestion ?? "" ] } } // ----- extension NSError { convenience init(apiError: ApiError) { self.init(domain: ApiError.errorDomain, code: apiError.errorCode, userInfo: apiError.errorUserInfo) } }
'Programming > Swift(iOS)' 카테고리의 다른 글
Swift Generic - 1 (0) 2021.04.06 Swift 오류처리 -3 (0) 2021.04.06 Swift 오류 처리 - 2 (0) 2021.04.06 Swift 오류 처리 - 1 (0) 2021.04.06 Swift 상속 (0) 2021.04.03