例外ハンドラのスコープ
例外ハンドラの記述 への移動
すべてのブロックにおいて、あらゆる種類の例外に対してハンドラを提供する必要はありません。 必要なのは、特定のブロック内で、特別に処理したい例外に対するハンドラのみです。
あるブロックが特定の例外を処理しない場合、例外が発生している状態で、実行はそのブロックを離れ、それを囲っているブロックに戻ります(または、ブロックを呼び出したコードに戻ります)。 このプロセスは、アプリケーションの一番外のスコープに到達、もしくは、例外を処理できるレベルのブロックに到達するまで、次々とより広いスコープに戻る形で繰り返されます。
このため、例外処理コードは入れ子にすることができます。 つまり、入れ子のブロックを使用して、特定の例外のローカル処理を定義することができます。これは、それを囲むブロックの処理を上書きします。 例:
try
{ statements }
try
{ special statements }
except
on ESomething do
begin
{ handling for only the special statements }
end;
end;
{ more statements }
except
on ESomething do
begin
{handling for statements and more statements, but not special statements}
end;
end;
メモ: このタイプの入れ子は、例外処理ブロックに限定されません。 これは、finally ブロック(「Finally ブロックの記述」で説明)や、例外処理ブロックと finally ブロックの混合でも使用できます。