で宣言された関数をthrows
Swiftで呼び出すときは、関数呼び出しサイトにtry
またはで注釈を付ける必要がありますtry!
。たとえば、スロー関数があるとします。
func willOnlyThrowIfTrue(value: Bool) throws {
if value { throw someError }
}
この関数は次のように呼び出すことができます:
func foo(value: Bool) throws {
try willOnlyThrowIfTrue(value)
}
ここでは、で呼び出しに注釈を付けていますtry
。これにより、この関数が例外をスローする可能性があり、後続のコード行が実行されない可能性があることをリーダーに呼び出します。また、この関数に注釈を付ける必要がありthrows
、この機能はとき(すなわち、例外をスローする可能性があるため、willOnlyThrowIfTrue()
スロー、その後、foo
自動的に上向きに例外を再スローします。
スローする可能性があると宣言されているが、正しい入力を与えているためにスローされないことがわかっている関数を呼び出す場合は、を使用できますtry!
。
func bar() {
try! willOnlyThrowIfTrue(false)
}
このように、コードがスローしないことを保証する場合、例外の伝播を無効にするために追加のボイラープレートコードを配置する必要はありません。
try!
実行時に適用されます。 try!
して関数がスローする場合、プログラムの実行は実行時エラーで終了します。
ほとんどの例外処理コードは上記のようになります。例外が発生したときに例外を上方に伝搬するか、例外を除外するような条件を設定します。コード内の他のリソースのクリーンアップは、オブジェクトの破棄(つまりdeinit()
)、またはときどきdefer
edコードを介して行う必要があります。
func baz(value: Bool) throws {
var filePath = NSBundle.mainBundle().pathForResource("theFile", ofType:"txt")
var data = NSData(contentsOfFile:filePath)
try willOnlyThrowIfTrue(value)
// data and filePath automatically cleaned up, even when an exception occurs.
}
なんらかの理由で、実行する必要があるがdeinit()
関数内にないコードをクリーンアップしている場合は、を使用できますdefer
。
func qux(value: Bool) throws {
defer {
print("this code runs when the function exits, even when it exits by an exception")
}
try willOnlyThrowIfTrue(value)
}
例外を除いて、取引は、単に彼らが経て途中でクリーンアップをやって、発信者に上向きに伝播していることをほとんどのコードdeinit()
またはdefer
ます。これは、ほとんどのコードがエラーの処理方法を知らないためです。何が問題だったかはわかっていますが、エラーについて何をすべきかを知るために、より高いレベルのコードが何をしようとしているかについては十分な情報がありません。ユーザーにダイアログを表示することが適切かどうか、再試行する必要があるかどうか、または他に何か適切かどうかはわかりません。
ただし、上位レベルのコードは、エラーが発生した場合の対処法を正確に把握している必要があります。そのため、例外を使用すると、特定のエラーが最初に発生した場所から処理可能な場所に発生します。
例外の処理はcatch
ステートメントを介して行われます。
func quux(value: Bool) {
do {
try willOnlyThrowIfTrue(value)
} catch {
// handle error
}
}
複数のcatchステートメントを使用して、それぞれが異なる種類の例外をキャッチすることができます。
do {
try someFunctionThatThowsDifferentExceptions()
} catch MyErrorType.errorA {
// handle errorA
} catch MyErrorType.errorB {
// handle errorB
} catch {
// handle other errors
}
例外のあるベストプラクティスの詳細については、http://exceptionsafecode.com/を参照してください。これは特にC ++を対象としていますが、Swift例外モデルを調べた結果、基本はSwiftにも適用されると思います。
Swift構文とエラー処理モデルの詳細については、 『The Swift Programming Language(Swift 2 Prerelease)』を参照してください。