Handling (do - try - catch) (feat. LocalizedError)


皆さんこんにちは、今日は利用したEnumのエラー処理を簡単にご紹介します.
エラー処理とは、プログラムが予想通りに実行できるかどうかを判断せず、エラーが発生した場合に適切な操作を行うために発生する可能性のあるエラーを予測することです.
まず、どのようにエラーを投げ出しますか?
エラーが通過throws投げ出されます.
func buy(product: String) throws {
    guard money > 1000  else {
        throw VendingMachine.noMoney
    }
    guard stock > 0 else {
        throw VendingMachine.soldOut
    }
    print("\(product) 나왔습니다.")
}
上記の例では、buy()関数の残高が1000未満、または在庫が0未満の場合、エラーが発生し、エラーが放出されます.
では、エラーを受け取ったところで処理すべきです.
エラー処理でよく使われるのはdo-try-catchdo-try-catch以下の形態:
    do {
        try expression
        statements
    } catch pattern 1 {
        
    } catch pattern 2 {
    
    } catch {
    
    }
doセクションでtryによってエラーが投げ出されると、catchセクションはエラーを受信し、エラーに基づいて処理します.
たとえば、
doセクションはbuy()関数の前にtryを書き込み、関数で発生したエラーを試行します.したがって、エラーが発生した場合、catchセクションでエラーが処理されます.
do {
    try buy(product: "음료수")
} catch VendingMachine.noMoney {
    print("잔액부족입니다.")
} catch VendingMachine.soldOut {
    print("품절입니다.")
}
ではVendingMachine.noMoneyVendingMachine.soldOut何でしょうか?
これは私が列挙型で定義したエラータイプです.
間違いは列挙型と友達です.エラーを定義するときに列挙を使用することを推奨します.
enum VendingMachine: Error {
    case noMoney
    case soldOut
    
    
    var errorDescription: String {
        switch self {
        case .noMoney:
            return "잔액부족입니다."
        case .soldOut:
            return "품절입니다."
        }
    }
}
また列挙型とswitchも友人です.この3つの方法の組合せはエラーを定義した.
列挙インスタンスを使用してエラーを定義し、errorDescriptionを計算プログラムとして宣言して、swich文を使用して各エラーに適切な操作を実行できます.
文字列のみが返されるようになりましたが、必要に応じて適切なメソッドを呼び出して、より多くの情報を提供することもできます.
エラーメッセージの管理方法については、次の議論を行います.
エラーメッセージの管理にもプロトコルを使用する方法があり、プロトコルを使用するメリットがまだ分からないので使用していません.LocalizedError利用契約のメリットをご存知の方がいらっしゃいましたら、コメントをお願いします.🙏