Ответ 1
Среда выполнения берет на себя ответственность за исключения после их повышения. Вам не нужно их освобождать.
Исключение уничтожается в конце блока, в котором он обрабатывается, как показано в этой программе:
{$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: Boo MyException.Destroy After try/except block
Пока отладчик может показать вам информацию об исключении после его освобождения, это поведение undefined. Компилятор понимает, что исключение оставило область видимости, даже если отладчик не знает этого факта.
Если вы хотите, чтобы время жизни исключения превышало блок except
, который обрабатывает его, вам нужно будет вызвать AcquireExceptionObject
. Как только вы это сделаете, ваша ответственность освободит исключение, чье жизненное время вы приобрели.