Обновление : Кажется, что это специфично для D2007.Он работает в D2010, как он работал в более старой версии.
Я хотел бы вернуть код выхода в зависимости от типа исключения, захваченного в блоке обработчика приёма, например:
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) из блока Exception всегда возвращает код выхода 1 , независимо от того, что вы передаете Halt ().
Очевидно, потому что выход из обработчика исключения вызывает Finalize, который очищает ожидающий (non Abort) Исключения, вызывающие SysUtils.ExceptHandler:
procedure ExceptHandler(ExceptObject: TObject; ExceptAddr: Pointer); far;
begin
ShowException(ExceptObject, ExceptAddr);
Halt(1); // <= @#$##@#$!
end;
И независимо от того, какой код выхода я хотел, я получаю, что Halt(1)
!
Так что вопрос:
Как я могу просто вернуть желаемый код выхода в зависимости от того, какое исключение было возбуждено?