Update: Es scheint spezifisch für D2007 zu sein. Es funktioniert in D2010 wie es in der älteren Version funktioniert hat.Wie wird ein Fehlercode mit Halt (n) von einem Ausnahmeblock mit D2007 zurückgegeben?
Ich möchte einen Exit-Code zurück auf die Art der Ausnahme in dem Block eception Handler gefangen abhängig wie:
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.
Leider gibt es in D2007, Aufruf Halt (n) von einem Ausnahmeblock immer zurückkehrt ein Exit-Code 1, egal, was Sie an Halt() übergeben.
Offenbar, weil von einer Exception-Handler Verlassen ruft Finalize, die die anstehenden (nicht Abort) Ausnahmen löscht, ruft SysUtils.ExceptHandler:
procedure ExceptHandler(ExceptObject: TObject; ExceptAddr: Pointer); far;
begin
ShowException(ExceptObject, ExceptAddr);
Halt(1); // <= @#$##@#$!
end;
Und egal, welchen Code Ausgang Ich wollte ich, dass Halt(1)
bekommen!
Die Frage ist also:
Wie kann ich Dich einfach die Exit-Codes gewünscht je nachdem, welche Exception ausgelöst wurde?
Basierend auf dem Kommentar unten von Mike, was wahr ist, ist es in der Tat die richtige Fehlercode zurückgibt. Ich vermute, dass es die Methode ist, die Sie verwenden, um den ErrorCode zu erhalten, der möglicherweise nicht wie erwartet funktioniert. – zz1433
@ Aldo. Nein, es ist D2007. Die gleiche genaue Sache verhält sich anders mit D2007 und D2010, wo es zurück ist, wie ich von Mike erwartet und berichtet habe. –
Bitte reichen Sie einen großen Bericht in QC (http://qc.embarcadero.com/); obwohl es wahrscheinlich kein D2007-Upgrade geben wird, ist es schön, dort sehen zu können, welche Bugs "bekannt" sind. –