Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

FriendlyErrorType

772 views

Published on

ErrorTypeを使っていく上での問題点を解決する方針

Published in: Software
  • Be the first to comment

  • Be the first to like this

FriendlyErrorType

  1. 1. FriendlyErrorType naoty
  2. 2. NSError • エラーを表すオブジェクト • 昔から使われてきた • ** NSErrorにnilを渡すことでエラーハンドリングを 簡単にサボることができる。
  3. 3. ErrorType • エラーを表す型が実装すべきprotocol • Swift 2.0で導入された。 • ErrorTypeをthrowするメソッドを呼び出す際は
 do catchでエラーハンドリングする必要がある。
  4. 4. ErrorTypeへの移行 • エラーハンドリングをコンパイル時に強制できるた めやや安全(catch内で無視することはできる)。 • Cocoaフレームワーク内のメソッドがErrorTypeを 使う形に置き換えられている。 • アプリ独自のエラーもErrorTypeで実装すべき?
  5. 5. ErrorTypeの問題点 • NSErrorには存在した詳細なエラー情報がない。 • localizedDescription • localizedFailureReason • localizedRecoverySuggestion
  6. 6. ErrorType public protocol ErrorType { } extension ErrorType { }
  7. 7. FriendlyErrorType • ErrorTypeを継承したprotocol • NSErrorが持っていた基本的な情報を定義する。 • ErrorTypeの問題点を解決するひとつの案です。
  8. 8. FriendlyErrorType protocol FriendlyErrorType: ErrorType { var summary: String { get } var reason: String? { get } var suggestion: String? { get } }
  9. 9. enum ApplicationError: FriendlyErrorType { case SomethingWrong case DecodeFailed([String]) var summary: String { switch self { case .SomethingWrong: return “Something wrong.” case .DecodeFailed(let fields): let failedFields = fields.joinWithSeparator(“, “) return “Failed to decode fields: (failedFields)” } } }
  10. 10. NSErrorとの共存 • Alamofire等を使っているとNSErrorを扱う場面が まだある。 • Promise系のライブラリでエラー型を統一したい場 合、ErrorTypeとNSErrorを同じように扱いたい。 • NSErrorを拡張してprotocolを実装することで
 解決できる。
  11. 11. extension NSError: FriendlyErrorType { var summary: String { return localizedDescription } var reason: String? { return userInfo[(略)] as? String } var suggestion: String? { return userInfo[(略)] as? String } }
  12. 12. return Task<Void, [Item], FriendlyErrorType> { … in Alamofire.request(…).responseJSON { response in switch response.status { case .Success(let value): do { let items = try decode(value) as [Item] fulfill(items) } catch DecodeError.MissingKeyPath(let keyPath) { reject(ApplicationError.DecodeFailed(keyPath.components)) } catch { reject(ApplicationError.SomethingWrong) } case .Failure(let error): reject(error) } } }
  13. 13. まとめ • NSErrorよりErrorTypeを積極的に使おう。 • ErrorTypeを継承したprotocolでエラー情報を追加 することでErrorTypeの欠点をカバーできる。 • NSErrorを拡張してprotocolを実装することで ErrorTypeとNSErrorの共存も可能。

×