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