Ir al contenido


Foto

Capturar cualquier exception y pasarlo como parámetro


  • Por favor identifícate para responder
4 respuestas en este tema

#1 Fleon

Fleon

    Advanced Member

  • Miembros
  • PipPipPip
  • 172 mensajes
  • LocationRepública Dominicana

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:


delphi
  1. procedure MuestraError(<capturo excepcion>);
  2. begin
  3. //Manejo de la excepcion capturada
  4. end;

Fleon xDD


  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

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í
 


delphi
  1. try
  2. //Se hace algo
  3. except
  4. on e:Exception do
  5. MuestraError(e.Message);
  6. end:

Saludos


  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 21 septiembre 2017 - 04:42

Para ampliar lo dicho por Eliseo, tal procedimiento debe ser declarado así:


delphi
  1. procedure MuestraError(AException: Exception);
  2. begin
  3. // aqui tu codigo
  4. end;

Y su uso:


delphi
  1. try
  2. // bla
  3. except
  4. on E:Exception do
  5. MostrarError(E);
  6. 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:


delphi
  1. try
  2. // hacer algo que puede dar una excepcion
  3. except
  4. on E:Exception do
  5. begin
  6. // bla bla
  7. end;
  8. on E:ExceptionHija do
  9. begin
  10. // bla bla
  11. end;
  12. 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,


  • 2

#4 Fleon

Fleon

    Advanced Member

  • Miembros
  • PipPipPip
  • 172 mensajes
  • LocationRepública Dominicana

Escrito 23 septiembre 2017 - 04:02

Muchas gracias amigos, estaré probando sus ideas.

 

Fleon xDD


  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

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í:


delphi
  1. procedure MostrarError(AModulo: String, ATipoError: String; ATitulo: String; AMsg: String);
  2. begin
  3. FErrorForm := TFErrorForm.Create(Self);
  4. try
  5. FErrorForm.Label1.Caption := ATitulo;
  6. FErrorForm.Memo1.Lines.Text := AMsg;
  7. FErrorForm.TipoError := ATipoError;
  8. FErrorForm.ShowModal;
  9. finally
  10. FErrorForm.Free;
  11. end;

Se usaría de ésta forma:


delphi
  1. try
  2. ...
  3. except
  4. on E:Exception do begin
  5. MostrarError('Ventas',E.ClassName,'¡Ocurrió un problema al intentar generar la venta!',E.Message);
  6. Exit;
  7. end;
  8. end;

Más abajo dejo anexo formulario de error en diseño.

 

Saludos.

Archivos adjuntos


  • 0




IP.Board spam blocked by CleanTalk.