Aggiornamento: Sembra essere specifico per D2007. Funziona in D2010 come ha funzionato nella versione precedente.Come restituire un codice di errore con Halt (n) da un blocco Exception con D2007?
Vorrei restituire un codice di uscita a seconda del tipo di eccezione catturato nel blocco Eception Handler come:
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.
Purtroppo in D2007, chiamando Halt (n) da un blocco di eccezione restituisce sempre un codice di uscita 1, indipendentemente da ciò che si passa a Halt().
apparentemente perché uscendo da un gestore di eccezioni chiamate Finalizza, che cancella le eccezioni in sospeso (non rinunciare), chiamando SysUtils.ExceptHandler:
procedure ExceptHandler(ExceptObject: TObject; ExceptAddr: Pointer); far;
begin
ShowException(ExceptObject, ExceptAddr);
Halt(1); // <= @#$##@#$!
end;
E non importa quello che il codice di uscita che volevo l'ho capito Halt(1)
!
Quindi la domanda è:
Come posso semplicemente restituire il codice di uscita desiderato a seconda di quale eccezione è stata sollevata?
Sulla base del commento qui sotto da Mike, che è vero, anzi fa ritorno l'errorcode corretta. Sospetto che sia il metodo che usi per ottenere il Codice errore che potrebbe non funzionare come previsto. – zz1433
@Aldo. No, è D2007. La stessa identica cosa si comporta diversamente con D2007 e D2010 dove è tornata come mi aspettavo e segnalata da Mike. –
Si prega di presentare un grande report in QC (http://qc.embarcadero.com/); anche se probabilmente non ci sarà un aggiornamento D2007, è bello poter vedere lì quali bug sono "conosciuti". –