Hola amigos, ¿es posible capturar cualquier excepción (exception) y pasarlo como parámetro en un procedimiento?, algo como esto:
procedure MuestraError(<capturo excepcion>); begin //Manejo de la excepcion capturada end;
Fleon xDD
Escrito 21 septiembre 2017 - 02:31
Hola amigos, ¿es posible capturar cualquier excepción (exception) y pasarlo como parámetro en un procedimiento?, algo como esto:
procedure MuestraError(<capturo excepcion>); begin //Manejo de la excepcion capturada end;
Fleon xDD
Escrito 21 septiembre 2017 - 04:14
Hola amigos, ¿es posible capturar cualquier excepción (exception) y pasarlo como parámetro en un procedimiento?, algo como esto:
Fleon xDD
Que te parece algo así
try //Se hace algo except on e:Exception do MuestraError(e.Message); end:
Saludos
Escrito 21 septiembre 2017 - 04:42
Para ampliar lo dicho por Eliseo, tal procedimiento debe ser declarado así:
procedure MuestraError(AException: Exception); begin // aqui tu codigo end;
Y su uso:
try // bla except on E:Exception do MostrarError(E); end;
Ahora bien, ten presente que este nivel de excepción es el más "alto" (o más "profundo", según como se lo viera) en la rama.
¿Que quiere decir esto? Que esta debe ser la última evaluación de todas las excepciones. Si por casualidad se tiene interés en capturar excepciones específicas debe respetarse el nivel de herencia y empezar a evaluar desde la "hoja" hacia "arriba" en el árbol.
¿Porqué? Por que así es como funciona el mecanismo para levantar excepciones. Supongamos el siguiente código:
try // hacer algo que puede dar una excepcion except on E:Exception do begin // bla bla end; on E:ExceptionHija do begin // bla bla end; end;
Si ExceptionHija es una subclase heredada de Exception el código anterior jamás la detectará porque la evaluación de su padre está antes de ésta. Hay que listarlas en orden.
MuestraError() aceptará cualquier excepción posible. Pero ten presente que ahora este debería ser el "último" lugar en donde tienes posibilidad de capturar alguna. Si en otra de tu código tienes otros try/except que capturen excepciones específicas éstos tendrán "prioridad".
El mecanismo de captura de excepción intenta capturar la excepción lo más cerca y superficial posible de donde se ha detectado el problema. Si no hay uno, va recorriendo la pila de llamadas en búsqueda de uno... así hasta llegar al nivel de aplicación en donde tiene lugar el evento OnException(). Por ejemplo, digamos que tu tienes un ButtonClick() en el que invocas a un método HacerAlgo() en el que existe la posibilidad de tener un error. Tienes entonces la posibilidad de hacer ahí mismo, en HacerAlgo() de capturar el error. Es lo más superficial, de no hacerlo, la segunda posibilidad está en ButtonClick(), y en último lugar a nivel aplicación con el evento OnException de un TApplicattionEvents.
Justamente, esta es una de las funcionalidades por la que fue pensado TApplicattionEvents, poder capturar excepción en lo más profundo y facilitar la implementación de un log de errores.
Te recomiendo una lectura sobre el funcionamiento de Excepciones. La Cara Oculta de Delphi 4 lo explica bien, en el capítulo 6 sino me falla la memoria.
Saludos,
Escrito 23 septiembre 2017 - 04:02
Muchas gracias amigos, estaré probando sus ideas.
Fleon xDD
Escrito 25 septiembre 2017 - 04:44
Yo tengo algo similar, sólo que tengo un pequeño formulario donde muestro el mensaje de error con un TImage, TLabel, un TMemo y dos TButtons (Cerrar y reportar, Cerrar) la cual lo creo desde un procedimiento, algo así:
procedure MostrarError(AModulo: String, ATipoError: String; ATitulo: String; AMsg: String); begin FErrorForm := TFErrorForm.Create(Self); try FErrorForm.Label1.Caption := ATitulo; FErrorForm.Memo1.Lines.Text := AMsg; FErrorForm.TipoError := ATipoError; FErrorForm.ShowModal; finally FErrorForm.Free; end;
Se usaría de ésta forma:
try ... except on E:Exception do begin MostrarError('Ventas',E.ClassName,'¡Ocurrió un problema al intentar generar la venta!',E.Message); Exit; end; end;
Más abajo dejo anexo formulario de error en diseño.
Saludos.