Fra*_*ois 6 delphi exception halt exit-code delphi-2007
更新:似乎特定于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.
Run Code Online (Sandbox Code Playgroud)
不幸的是,在D2007中,从异常块调用Halt(n)总是返回退出代码1,无论你传递给Halt().
显然,因为退出Exception处理程序调用Finalize,它会清除挂起(非Abort)异常,调用SysUtils.ExceptHandler:
procedure ExceptHandler(ExceptObject: TObject; ExceptAddr: Pointer); far;
begin
ShowException(ExceptObject, ExceptAddr);
Halt(1); // <= @#$##@#$!
end;
Run Code Online (Sandbox Code Playgroud)
无论我想要什么退出代码,我都能得到它Halt(1)
!
所以问题是:
我怎样才能简单地返回所需的退出代码,具体取决于引发的异常?
这会有用吗?
NeedHalt := False;
try
raise EExternal.Create('sdsdkfjh');
except
on E:EExternal do
begin
Writeln(E.Classname, ': ', E.Message);
NeedHalt := True;
end;
end;
if NeedHalt then
Halt(Exitcode);
Run Code Online (Sandbox Code Playgroud)
或这个?
try
raise EExternal.Create('sdsdkfjh');
except
on E:EExternal do
begin
Writeln(E.Classname, ': ', E.Message);
AcquireExceptionObject;
Halt(Exitcode);
end;
end;
Run Code Online (Sandbox Code Playgroud)
无论如何:这是D2007中的一个错误,已在D2010中修复.