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"
}
エラーを処理するにはいくつかの方法があります。一つの方法は do
–catch
を使用することです。do
ブロックの中で、コードの前に try
を記述して、エラーを投げることをコードにマークします。catch
ブロックの中では、別の名前を付けないかぎり、エラーには自動的に error
という名前が与えられます。
do {
let printerResponse = try sendToPrinter("Bi Sheng")
print(printerResponse)
} catch {
print(error)
}
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)
}
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.