ErrorType プロトコルを採用する型を使用してエラーを表明します。

enum PrinterError: ErrorType {
    case OutOfPaper
    case NoToner
    case OnFire
}

throw でエラーを投げ、throws でエラーを投げられることを関数にマークします。関数内でエラーを投げる場合、関数はすぐにリターンし、関数を呼び出したコードがエラーを処理します。

func sendToPrinter(printerName: String) throws -> String {
    if printerName == "Never Has Toner" {
        throw PrinterError.NoToner
    }
    return "Job sent"
}

エラーを処理するにはいくつかの方法があります。一つの方法は docatchを使用することです。do ブロックの中で、コードの前に try を記述して、エラーを投げることをコードにマークします。catch ブロックの中では、別の名前を付けないかぎり、エラーには自動的に error という名前が与えられます。

do {
    let printerResponse = try sendToPrinter("Bi Sheng")
    print(printerResponse)
} catch {
    print(error)
}
EXPERIMENT
関数 sendToPrinter がエラーを投げるよう、プリンターの名前を "Never Has Toner" に変更してみよう。

catch ブロックを複数にして、特定のエラーを処理させることができます。switch での case と同じようにして、catch の後にパターンを記述します。

do {
    let printerResponse = try sendToPrinter("Gutenberg")
    print(printerResponse)
} catch PrinterError.OnFire {
    print("I'll just put this over here, with the rest of the fire.")
} catch let printerError as PrinterError {
    print("Printer error: \(printerError).")
} catch {
    print(error)
}
EXPERIMENT
do ブロックの中に、エラーを投げるコードを追加してみよう。最初の catch ブロックでエラーが処理されるようにするには、どのようなエラーを投げる必要があるでしょうか。2 番目、3 番目のブロックについてはどうでしょうか。

エラーを処理する別の方法は、結果をオプショナルに変換するために try? を使用することです。関数がエラーを投げる場合、その特定のエラーは捨てられて、結果は nil になります。そうでない場合は、結果は関数が返した値を含むオプショナルになります。

let printerSuccess = try? sendToPrinter("Mergenthaler")
let printerFailure = try? sendToPrinter("Never Has Toner")

エラーが投げられるかどうかにかかわらず、関数がリターンする前に常に実行されるコードブロックを記述するために defer を使用します。いくつかの異なる場所からリターンする関数を簡略化するために、エラー処理がない場合でも defer を使用することができます。

var teaKettleHeating = false
func morningRoutine() throws {
    teaKettleHeating = true
    defer {
        teaKettleHeating = false
    }

    let newspaper = try sendToPrinter("Lanston")
    // お茶を飲み、新聞を読む
}

Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.