Swift 2の新しいエラー処理を理解するために試してみます。これが私がしたことです:最初にエラー列挙型を宣言しました:
enum SandwichError: ErrorType {
case NotMe
case DoItYourself
}
そして、エラーをスローするメソッドを宣言しました(例外ではなく、エラーです)。ここにその方法があります:
func makeMeSandwich(names: [String: String]) throws -> String {
guard let sandwich = names["sandwich"] else {
throw SandwichError.NotMe
}
return sandwich
}
問題は呼び出し側からです。このメソッドを呼び出すコードは次のとおりです。
let kitchen = ["sandwich": "ready", "breakfeast": "not ready"]
do {
let sandwich = try makeMeSandwich(kitchen)
print("i eat it \(sandwich)")
} catch SandwichError.NotMe {
print("Not me error")
} catch SandwichError.DoItYourself {
print("do it error")
}
do
行コンパイラの後は言うErrors thrown from here are not handled because the enclosing catch is not exhaustive
。しかし、私の意見では、SandwichError
列挙型の場合は2つしかないため、それは網羅的です。
通常のswitchステートメントの場合、swiftは、すべてのケースが処理されたときに網羅的であることを理解できます。
do
は、非網羅的な最上位のブロックを許可するように見えます-スローしない関数でdoをラップすると、エラーが発生します。