Как возвратить код ошибки с Остановом (n) от блока Исключения с D2007?

Обновление: Это, кажется, характерно для 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)!

Таким образом, вопрос:
Как я могу просто возвратить желаемый Код выхода, в зависимости от которого было повышено Исключение?

6
задан François 4 August 2010 в 21:14
поделиться