終了処理の中の例外を見逃すな !
|
Object Pascal の構造化例外処理の 1 つである try 〜 finally には思わぬメモリリークの可能性があります。
ObjectPascal言語ガイドには次のように記述されています。
-begin-
生成された例外が finally で処理されない場合,その例外は try...finally 文を越えて伝わり,try 節で既に生成されている例外は失われます。したがって,ほかの例外の伝播の妨げにならないよう,ローカルに生成された例外はすべて finally 節で処理するようにしてください。
-end-
つまり、
try
保護ブロック
finally
終了ブロック
end;
という記述の中で、保護ブロックの中で例外が発生した場合に、さらに終了ブロックで補足されない例外が発生してはいけないことになります。
A = TA.Create;
try
A.Start;
A.MethodCall; // ここで例外が起こる可能性がある !
finally
A.Stop; // ここでも例外が起こる可能性がある !
A.Free;
end;
ではなく
A = TA.Create;
try
A.Start;
A.MethodCall; // ここで例外が起こる可能性がある !
finally
try
A.Stop; // ここでも例外が起こる可能背がある !
except
// A.Stop が失敗したときに必要な処理があればココへ
end;
A.Free;
end;
などと、finally 節内での例外を補足し処理しなければなりません。
# 補足し処理するので try 〜 except 構文を用います。 |
|