この「自明」の例では、実行時例外を上げると投げの違いを見るのを助けることができますErrorTypeプロトコルに準拠したエラーE。
struct E: ErrorType{}
func foo(bar:String?) throws {
if let error = bar where error == "error" {
throw E()
}
print(bar, "is valid parameter, but don't try to access bar.characters, it crash your code! (if bar == nil)")
// here is everything OK
let bar = bar!
// but here it crash!!
_ = bar.characters
}
do {
try foo("error")
// next line is not accessible here ...
try foo(nil)
} catch {
print("\"error\" as parameter of foo() throws an ERROR!")
}
do {
try foo(nil) // fatal error: unexpectedly found nil while unwrapping an Optional value
} catch {
}
それは実行時例外を上げる
"error" as parameter of foo() throws an ERROR!
nil is valid parameter, but don't try to access bar.characters, it crash your code! (if bar == nil)
fatal error: unexpectedly found nil while unwrapping an Optional value
を印刷しますが、あなたのコード内で致命的なエラーです。
'throw '(これはエラーがそのような関数内から伝播する原因となります)でエラーを投げても、' nil'を強制解除したときと同じことです。私はどこかで 'assert()'として実装されていると読んでいると思います。 –
それはそれを説明するだろうが、それはひどい。たぶん引数がありますが、例外をサポートする言語では一貫性がないようです。 – Greg
@Greg:ニコラスが正しいです。 try/catchはSwift * errors *(Throwされる 'ErrorType'に準拠した値)を処理することに注意してください。それは、ランタイムエラーや例外とはまったく関係ありません。 (ドキュメントでは、スロー/トライ/キャッチと関連して「例外」という単語はなく、「エラー処理」のみです。) –