gpt4 book ai didi

delphi - 异常处理后我应该释放/销毁异常吗?

转载 作者:行者123 更新时间:2023-12-03 14:38:21 25 4
gpt4 key购买 nike

我正在调试一个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 上,我仍然可以看到它的值。我预计这超出了范围,并最终被摧毁。

所以,我的问题是:异常处理后我应该释放/销毁异常吗?

最佳答案

运行时在引发异常后获得异常的所有权。您不需要释放它们。

异常在处理它的 block 的末尾被销毁,如以下程序所示:

{$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: BooMyException.DestroyAfter try/except block

虽然调试器在释放异常后仍可能向您显示有关异常的信息,但该行为是未定义的。编译器知道异常已经离开范围,即使调试器不知道这一事实。

<小时/>

如果您希望异常的生命周期超出处理异常的 except block ,那么您需要调用 AcquireExceptionObject。一旦你这样做了,你就有责任释放你获得的生命周期的异常。

关于delphi - 异常处理后我应该释放/销毁异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17719101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com