Swiftとtry
Typed propagation
関数の宣言、もしくは型にて、エラーが発行されることを明示できる場合、その言語は Typed propagation を持つ、と言える。
code:swift
func foo () -> Int { // 例外の発行が許されない
func bar () throws -> Int { // 例外の発行が許される
Enforced typed propagation
Typed propagation を持つ言語にて、明示していない場合には内部でエラーを発行することができない場合、Statically-enforced typed propagation を持つ、と言える。
code:swift
func foo () -> Int {
throw Error() // コンパイルエラー
}
func bar () -> Int {
do { throw Error() } catch { /* ... */ } // OK
}
func hoo () throws -> Int {
throw Error() // OK
}
Marked propagation
エラーが発生しえるステートメントや式を明示することが求められる場合、その言語は Marked propagation を持つ、と言える。
code:java
// どこから例外が送出されたかわからない
void foo() {
a();
b();
c();
}
code:swift
// どこから例外が送出されるかが明示できる
func foo() throws {
a()
try b()
c()
}
Manual propagation
エラーを通常の値と同じように扱い、通常の制御構文を用いて取り扱う場合の伝播方法は、Manual propagation と言える。
code:swift
switch(toInt(string)) {
case let . Success(number):
// ...
case let .Failure(error):
// ...
}
Automatic propagation
専用の構文を用いてエラー箇所からハンドリング箇所へ暗黙的にジャンプするような伝播方法は、Automatic propagation と言える。
code:swift
do {
let number = try toInt(string)
// ...
} catch let error {
// ...
}