try 式は、本体、0 個以上の
catch 句、およびオプションの
finally 句で構成されます。本体は、完了するか、
Exception がスローされるまで実行されます。
catch 句には、
Exception 型を指定する正式パラメータ宣言があります。本体が完了する前に本体外に
Exception がスローされると、catch 句が順番に検討され、スローされた値と互換性のある変数型を持った (
isa により判定) 最初の catch 句が、その変数をキャッチされた値に設定して実行されます。各 catch 句変数の型は、
Exception のサブタイプでなくてはならず、以前の catch 句変数のサブタイプであってはなりません。
finally 句が存在する場合は、常に本体または catch ボディの後で実行されます。本体が正常に終了したかどうかには関係ありません。
API バージョン 4.0 より、
try ステートメントは、その本体と
catch 句の本体に基づく値を生成します。ただし、
finally の本体は含まれません。
switch のみがある場合は、
body の最後のステートメントと
catch-body が、値を生成するか、例外をスローするか、または戻り値を返すいずれかの場合にのみ値を生成します。
body が例外をキャッチすることなく実行した場合、最終ステートメントが値を生成します。例外がキャッチされた場合には、
catch 句本体の最終ステートメントが値を生成します。
catch 句または
finally 句そのものが
Exception をスローする場合、現在の
try 式は終了します。このような
Exception は、外側にネストされた
try 式によりキャッチすることができます。
API バージョン 4.0 より、
return、
break、および
continue ステートメントは、
try 式の外部に制御を移すために使用することができます。ただし、
finally ブロックの外部に制御を移すことはできません。
finally ブロックの実行が終了すると直ちに例外がスローされる可能性があるためです。