delphi – 如何使用D2007从Exception块返回带有Halt(n)的错误代码?

更新:似乎特定于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(n)总是返回退出代码1,无论你传递给Halt().

显然,因为退出Exception处理程序调用Finalize,它会清除挂起(非Abort)异常,调用SysUtils.ExceptHandler:

procedure ExceptHandler(ExceptObject: TObject; ExceptAddr: Pointer); far;
begin
  ShowException(ExceptObject,ExceptAddr);
  Halt(1); // <= @#$##@#$!
end;

无论我想要什么退出代码,我都会得到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);

或这个?

try
  raise EExternal.Create('sdsdkfjh');
except
  on E:EExternal do
  begin
    Writeln(E.Classname,E.Message);
    AcquireExceptionObject;
    Halt(Exitcode); 
  end;
end;

无论如何:it’s a bug in D2007,which was fixed in D2010.

相关文章

ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c++ 调用, 抽空研究了一下该库的最新版 ,把...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的功能是:将源操作数送到目的操作数中,即:...
有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因为使用复杂...
API原型: Declare Function MoveFileEx& Lib "kernel32" Alias "MoveFileExA" (By...