ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift 오류처리 - 3
    Programming/Swift(iOS) 2021. 4. 6. 11:22
    728x90

    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
Designed by Tistory.