例外の再生成
例外ハンドラの記述 への移動
例外をローカルで処理する際、封入ブロック内の処理を、他と置き換えるより、むしろ増やしたい場合もあるでしょう。もちろん、ローカル ハンドラがその処理を終えれば、それが例外インスタンスを破壊するので、封入ブロックのハンドラが動作することはありません。しかし、その例外を破壊しないようにし、括弧内のハンドラが応答する機会を与えることもできます。これには、引数なしの raise コマンドを使用します。これを、例外の再生成または再送出と言います。次の例で、このテクニックを示します:
try
{ statements }
try
{ special statements }
except
on ESomething do
begin
{ handling for only the special statements }
raise;{ reraise the exception }
end;
end;
except
on ESomething do ...;{ handling you want in all cases }
end;
statements 内のコードが ESomething 例外を起こすと、外側の例外処理ブロックのハンドラのみが実行されます。しかし、special statements 内のコードが ESomething を起こすと、内側の例外処理ブロックの処理が実行され、続いて、外側の例外処理ブロックのより汎用的な処理が行われます。例外を再生成することにより、簡単に特殊ケースにおける例外のための特別な処理を、既存のハンドラを失う(または重複させる)ことなく、提供することができます。
ハンドラが別の例外を送出したい場合、「例外の生成」での説明の通り、raise 文または throw 文を通常の通り使用します。