Actualización: Parece ser específico para D2007. Funciona en D2010 como si funcionó en una versión anterior.¿Cómo devolver un código de error con Alto (n) desde un bloque de Excepción con D2007?
me gustaría devolver un código de salida en función del tipo de excepción detectada en el bloque eception Handler como:
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.
Por desgracia, en D2007, llamando Halt (n) a partir de un bloque de excepción siempre devuelve un código de salida 1, pase lo que pase a Halt().
Al parecer debido a la salida de un controlador de excepciones llamadas Finalizar, que borra las excepciones pendientes (no renunciar), llamando SysUtils.ExceptHandler:
procedure ExceptHandler(ExceptObject: TObject; ExceptAddr: Pointer); far;
begin
ShowException(ExceptObject, ExceptAddr);
Halt(1); // <= @#$##@#$!
end;
Y no importa lo que el código de salida que quería consigo que Halt(1)
!
Así que la pregunta es:
Como puedo devuelva el código de salida deseada dependiendo de la excepción fue levantado?
Basado en el comentario anterior de Mike, lo cual es cierto, de hecho lo hace volver el código de error correcto. Sospecho que es el método que utiliza para obtener el Código de Error que podría no funcionar como se esperaba. – zz1433
@ Aldo. No, es D2007. Lo mismo se comporta de manera diferente con D2007 y D2010, donde está de vuelta como esperaba e informado por Mike. –
Por favor presente un gran informe en QC (http://qc.embarcadero.com/); aunque probablemente no habrá una actualización D2007, es bueno poder ver qué errores son 'conocidos'. –