wiftクリア-Error Handling


プログラムエラーに応答してリカバリするプロセス
一部の操作(ディスクファイルI/Oなど)では、必ずしも実行が完了したり、有用な出力が生成されたりすることは保証されません.
このとき,適切な応答を得るためには,誤りの原因を容易に見つけることができる.

Errorの相互運用性


SWIFTにおけるエラー処理は、CocoおよびObjective-CにおけるNSErrorを用いたエラー処理モードと相互に動作する

Representing and Throwing Errors


エラーはErrorプロトコルに準拠する値タイプです.
  • enumエラー条件のモデリングに特に適している
  • 関連値を使用してエラー特性に関する詳細情報を提供
  • enum VendingMachineError: Error {
        case invalidSelection
        case insufficientFunds(coinsNeeded: Int)
        case outOfStock
    }
    
    throw VendingMachineError.insufficientFunds(coinsNeeded: 5)
    // 코인이 5개 더 필요하다는 것을 쉽게 인지

    Handling Errors


    エラーが発生した場合は、周辺コードがエラー処理を担当します
    SWIFTのエラー処理方法は大きく4つに分けられます.
  • この関数を呼び出すコードにエラーが伝播しました(throw)
  • do-catch使用文法
  • エラーを外部値に変換(try?)
  • エラーが発生しないことを確信(try!)
  • throwの性能


    SWIFTでのエラー処理は他言語でのエラー処理とは異なります.
    コールスタックのキャンセルは含まれず、計算コストが高い
    したがって、throwの性能はreturnと類似している.

    Propagating Errors Using Throwing Functions

    throws関数宣言のパラメータ部分にキーワードを書き、エラーが発生したことを宣言します.throwsキーワードとして宣言された関数をThrowing Functionと呼ぶ
    func canThrowErrors(...) throws -> String
    func cannotThrowErrors(...) -> String
    非Throwing Function関数は、関数内部で発生する可能性のあるすべてのエラーを処理する必要があります.

    Handling Errors Using Do-Catch

    do-catch構文を使用してコードブロックでエラーを処理
    catch処理するエラーは、モードの後に選択できます.
    モードがない場合は、すべてのエラーが格納され、エラーはerrorという領域定数にバインドされます.
  • do-catch処理されていないエラーが周囲に伝播します
  • Throwing Function需要do-catch構文または呼び出しの関数処理エラー
  • Throwing Functiondo-catch構文処理エラー
  • 処理されずに範囲の上部に伝播した場合、実行時にエラーが発生します
  • Converting Errors to Optional Values

    try?を使用してエラーを外部値に変換
    let weatherJsonData = fetchData()
    let weather = try? JSONDecoder().decode(Weather.self, weatherJsonData)
    print(weather)
    // if decode success - Optional(weather)
    // if decode fail - nil

    Disabling Error Propagation


    Throwing Functionでエラーが発生しないことを知っている場合は、try!を使用して呼び出しをブロックできます.
  • エラーが発生した場合、実行時にエラーが発生します
  • Specifying Cleanup Actions

    defer構文は、現在のコードブロックがthrowによって終了されるか、またはreturnおよびbreakによって終了される前に呼び出される.
  • defer構文のシフトを制御できます(return,...)エラーを発生できません
  • defer構文はコードの順序とは逆です