gpt4 book ai didi

delphi - 如何从包含 D2007 的异常 block 中使用 Halt(n) 返回错误代码?

转载 作者:行者123 更新时间:2023-12-03 14:59:47 24 4
gpt4 key购买 nike

更新:似乎是 D2007 特有的。它在 D2010 中的工作方式就像在旧版本中一样。

我想根据 Eception Handler block 中捕获的异常类型返回退出代码,例如:

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 中,从 Exception block 调用 Halt(n) 总是返回退出代码 1,无论您向 Halt() 传递什么内容。

显然是因为从异常处理程序退出时会调用 Finalize,它会调用 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 .

关于delphi - 如何从包含 D2007 的异常 block 中使用 Halt(n) 返回错误代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3409313/

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