Delphi Tips 
-----------------------------

0286  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/10/14 K.Takaoka rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/10/14 K.Takaoka 編集
終了処理の中の例外を見逃すな !


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 構文を用います。
参照: [Delphi-ML:41492] [Delphi-ML:41495] <PASCAL> []

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords


Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp