Обновление: Это похоже на D2007. Он работает в D2010, как и в старой версии.Как вернуть код ошибки с помощью Halt (n) из блока Exception с D2007?
Я хотел бы вернуть код выхода в зависимости от типа Exception пойманного в блоке Eception Handler как:
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 (п) от блока исключений всегда возвращаюсь Код выхода 1, независимо от того, что вы передадите, чтобы остановить().
Видимо, потому что выход из обработчика исключений не вызывает финализац, который очищает незавершенные (не являющихся Abort) Исключения, вызывая SysUtils.ExceptHandler:
procedure ExceptHandler(ExceptObject: TObject; ExceptAddr: Pointer); far;
begin
ShowException(ExceptObject, ExceptAddr);
Halt(1); // <= @#$##@#$!
end;
И независимо от того, что код выхода я хотел я понимаю, что Halt(1)
!
Так что вопрос:
Как я могу просто вернуть нужный код Выход в зависимости от того, который был поднят Exception?
Основываясь на комментарий ниже Майк, это верно, это действительно делает возвращение правильный ERRORCODE. Я подозреваю, что это метод, который вы используете для получения ErrorCode, который может работать не так, как ожидалось. – zz1433
@ Aldo. Нет, это D2007. То же самое происходит по-разному с D2007 и D2010, где он вернулся, как я ожидал, и сообщил Майк. –
Пожалуйста, напишите большой отчет в QC (http://qc.embarcadero.com/); хотя, вероятно, не будет обновления D2007, приятно видеть, какие ошибки «известны». –