12

Delphi プログラムをデバッグしています。

except
    on e: TErrorTapeDrive do
        if e.errorCode = 1104 then
            if Assigned(indexDoneEvent) then
                indexDoneEvent;
        // other handling...
    // other handling...
end;

Excetion e をキャッチし、必要なことを行います。ここで、デバッグ プログラム カウンタが のすぐ下の行に到達したときに、カーソルend;を合わせるe.errorCodeと、その値を確認できます。これは範囲外であり、最終的には破棄されたと思います。

だから、私の質問は次のとおりです。例外処理後に例外を解放/破棄する必要がありますか?

4

2 に答える 2

18

ランタイムは、発生した例外の所有権を取得します。それらを解放する必要はありません。

次のプログラムで示されているように、例外は処理されたブロックの最後で破棄されます。

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  MyException = class(Exception)
  public
    destructor Destroy; override;
  end;

destructor MyException.Destroy;
begin
  Writeln('MyException.Destroy');
  inherited;
end;

procedure Main;
begin
  try
    raise MyException.Create('Boo');
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Writeln('After try/except block');
end;

begin
  Main;
  Readln;
end.

出力:

MyException: ブー
MyException.Destroy
try/except ブロックの後

デバッガーは例外が解放された後も例外に関する情報を表示する場合がありますが、その動作は未定義です。デバッガーがその事実を認識していなくても、コンパイラーは例外がスコープを離れたことを理解します。


except例外の有効期間を、それを処理するブロックを超えて延長したい場合は、 を呼び出す必要がありますAcquireExceptionObject。いったんそれを行うと、取得した有効期間を持つ例外を解放するのはあなたの責任になります。

于 2013-07-18T09:14:18.687 に答える
5

コンパイラ + RTL がそれを処理してくれるので、そうしないでください。

例外ブロックの終了後もe: Exceptionオブジェクトがまだ「有効」である場合は、次の質問を参照してください。

.Free を呼び出した後でも Delphi オブジェクトが割り当てられるのはなぜですか?

何かを破棄しても、メモリがすぐに無効になるとは限りません。再利用できるようになるだけです。

于 2013-07-18T09:14:31.920 に答える