更新:它似乎特定于 D2007。它在 D2010 中工作,就像在旧版本中工作一样。
我想根据 Eception Handler 块中捕获的异常类型返回退出代码,例如:
program test;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
Exitcode: Integer;
begin
Writeln('Enter error code:');
Readln(Exitcode);
try
raise EExternal.Create('sdsdkfjh');
except
on E:EExternal do
begin
Writeln(E.Classname, ': ', E.Message);
Halt(Exitcode);
end;
end;
end.
不幸的是,在 D2007 中,无论您将什么传递给 Halt(),从 Exception 块调用 Halt(n) 总是返回退出代码 1 。
显然是因为从异常处理程序中退出调用了 Finalize,它清除了挂起的(非 Abort)异常,调用了 SysUtils.ExceptHandler:
procedure ExceptHandler(ExceptObject: TObject; ExceptAddr: Pointer); far;
begin
ShowException(ExceptObject, ExceptAddr);
Halt(1); // <= @#$##@#$!
end;
无论我想要什么退出代码,我都会得到它Halt(1)
!
所以问题是:
如何根据引发的异常简单地返回所需的退出代码?