SWIFTでのエラー処理

3250 ワード

  • 発生(投げ)
  • 検出(キャプチャ)
  • 電波(伝播)
  • 操作
  • swiftでは、エラーはErrorプロトコルに従うタイプの値として表される.
  • エラープロトコルは、要求されない空のプロトコルですが、エラーを表すためにこのプロトコルを使用する必要があります.
  • 列挙は、エラーの原因を区別し、エラーの特性に関する追加情報を提供するためのモデルを作成するのに適している.
  • 最も一般的な方法は、列挙された形式で誤った種類を表現することです.
    
    enum PhoneError: Error {
    	case unknown
        case batteryLow(batteryLevel: Int)
    }
    
    バッテリーの電力が不足しているときにエラーが発生したい場合は、throwを使用してエラーを発生することができます.
    throw PhoneError.batteryLow(batteryLevel: 20)

    ->エラー発生

    swiftエラーを処理する4つの方法

  • 関数で発生したエラーは、その関数を呼び出すコード
  • に伝播する.
  • do catch構文を使用してエラー
  • を処理
  • オプション値エラー処理
  • エラーが発生しないことを確認する方法
  • 1.関数のエラーを、その関数を呼び出すコードに伝播する


    関数、パラメータ、およびコンストラクション関数パラメータの後にthrowキーワードを作成し、エラーが発生する可能性があることを示します.
    
    func checkPhoneBatteryStatus(batteryLevel: Int) throws -> String {
    	guard batteryLevel != -1 else { throw PhoneError.unknown }
        guard batteryLevel >= 20 else { throw PhoneError.batteryLow(batteryLevel: 20) }
        
        return "배터리 상태가 정상입니다."
        // > guard 조건에 모두 걸리지 않으면 문자열 반환됨
    }
    
    guard文falseでelse文が実行され、関数が早期に終了するため、バッテリレベルが-1または20未満の場合はelse文が実行され、throwエラーが投げ出された後に関数が終了する

    2.docatch文でエラーを処理する

  • 関数、メソッド、ジェネレータなどでエラーが投げ出されると、エラーが渡されたコードブロックはdo catch文を使用してエラーを処理します.
  • do内のコードにエラーを投げ出し、catchでエラーを受信して異常処理を行う.
  • 
    do {
    	try 오류 발생 가능 코드
    } catch 오류 패턴 {
    	처리 코드
    }
    
    do {
    	try checkPhoneBatteryStatus(batteryLevel: -1)
    } catch PhoneError.unknown {
    	print("알 수 없는 에러입니다.")
    } catch PhoneError.batteryLow(let batteryLevel) {
    	print("배터리 전원 부족, 남은 배터리 : \(batteryLevel)%")
    } catch {
        print("그 외 오류 발생 : \(error)")
    }
    
    最後のcatch文はunknownエラーでもbutteryLowエラーでもない場合に実行される文です.エラーのタイプを指定せずにコードブロックを生成すると、そのコードブロックの内部にerrorという領域定数が暗黙的に含まれます.
  • checkPhoneBatteryStatus関数では、バッテリレベル=1はPhoneErrorです.sunnow throw do catch文でphoneError.不明な場合は、「不明なエラー」です.出力します.
  • 3.エラーをオプション値(try?)に処理

  • エラーを所望の値に変換して処理することができる.
  • try? 式で操作されたコードがエラーを投げ出すと、そのコードの戻り値はnilになります.
    
    let status = try? checkPhoneBatteryStatus(batteryLevel: -1)
    print(status)
    

    この場合、関数にエラーが発生しなかった場合

    外部値を出力します.

    4.エラーが発生しないようにする方法(try!)

  • 投げ関数または方法でエラーが投げ出されないと判断した場合は
  • を用いる.
    
    let status2 = try! checkPhoneBatteryStatus(batteryLevel: 40)
    print(status2)
    

    エラーが発生した場合

    プログラムは強制的に終了された.
    出典:クイックキャンパスiOSコース