更新:D2007に固有のようです。D2010でも、以前のバージョンと同じように機能します。
次のように、EceptionHandlerブロックでキャッチされた例外のタイプに応じて終了コードを返したいと思います。
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ブロックからHalt(n)を呼び出すと、Halt()に何を渡しても、常に終了コード1が返されます。
どうやら、例外ハンドラーを終了するとFinalizeが呼び出され、保留中の(中止されていない)例外がクリアされ、SysUtils.ExceptHandlerが呼び出されます。
procedure ExceptHandler(ExceptObject: TObject; ExceptAddr: Pointer); far;
begin
ShowException(ExceptObject, ExceptAddr);
Halt(1); // <= @#$##@#$!
end;
そして、私が望んでいた終了コードに関係なく、私はそれを取得しHalt(1)
ます!
したがって、問題は次のとおり
です。発生した例外に応じて、目的の終了コードを簡単に返すにはどうすればよいですか。