Cómo capturar errores genéricos (de todo tipo), tratamiento de excepciones, en Delphi y mostrar (o no) mensajes a medida, personalizados al usuario final. Explica la diferencia entre las cláusulas «except» y «finally». También muestra un listado de las clases de excepción (class exception) y la descripción de cada una de ellas.

Estructuras básicas para la captura de errores o excepciones en Delphi

En primer lugar explicamos las dos estructuras básicas para la captura de errores en el lenguaje de programación Borland o Codegear Delphi:

  • Except: en la estructura que mostramos a continuación sólo se ejecutará el código que va entre el «except» y el «end» si se produce un error. Si no se produce un error se continuará con la ejecución lógica del programa, si se produce un error se ejecutará el código entre el «except» y el «end» y se detendrá la ejecución lógica de la aplicación:
  • Finally: en la siguiente estructura el código que va entre el «finally» y el «end» se ejecutará siempre (tanto si se produce un error como si no). Este tipo de captura de errores suele ser usado para finalizar o liberar determinadas variables o estructuras que nos interese que siempre queden liberadas (tanto si se producen errores como si no):

Ejemplos de capturas de errores en Delphi con Except ó Finally

Ejemplos con try…except…end

Por ejemplo, podemos acotar un código susceptible de que se produzca una división por cero con un «try» y un «except» de la siguiente forma, además, podemos personalizar el mensaje de error que se producirá:

Nota: si cambiamos el código dentro del Except por:

Mostrará el mensaje de error propio generado por Delphi, sin personalizar.

En el ejemplo anterior hemos utilizado el objeto «exception» que es la clase padre. Si queremos mostrar un mensaje aún más personalizado por cada tipo de error que se pueda prodicir utilizaremos el siguiente código:

Ejemplos con Try…Finally…End

Un ejemplo utilizando «finally» (código que siempre se ejecutará tanto si hay error como si no):

En este caso hemos utilizado un ejemplo que crea un formulario y lo muestra modal, si la línea «formualario.ShowModal» da un error (por cualquier causa) se ejecutará lo que haya en el «finally» y si no da error también, con lo cual, en este caso, nos aseguramos de que el formulario modal se libera siempre tras su ejecución.

Con lo cual utilizaremos «finally» siempre que nos interese que se ejecute código tanto si se produce un error como si no, por ejemplo cuando creamos un objeto y queramos que este se libere sea cual sea el resultado de la creación. Y utilizaremos «except» en los demás casos, cuando queramos que el código de error sólo se ejecute cuando éste se produzca.

Cómo guardar log de errores en una tabla con Delphi

Si queremos guardar los errores para poder consultarlos posteriormente en una tabla de una base de datos, podemos usar el siguiente código en la cláusula «except … End»:

En este caso «md.tcSpam.Open» es un TQuery con una consulta SQL asociada, si se produce algún error se ejecutará lo que haya dentro del «except», se ejecutará un procedimiento llamado «insertarLog» que, a su vez, inserta un registro en una base de datos para guardar los posibles errores de la aplicación. A continuación os mostramos el código del procedimiento «insertarLog»:

Donde md es el nombre del módulo de datos (TDataModule) en el que está el TTable «tLog» que apunta a una tabla de la base de datos con la siguiente estructura (MySQL):

Aunque hemos de reconocer que no es conveniente utilizar funciones o procedimientos que puedan, a su vez, generar errores dentro de las cláusulas «except» ó «finally». Podríamos cambiar el código anterior por guardar el error en un fichero de texto plano, procedimiento que sería menos susceptible de generar errores que el de guardar en una base de datos.

Clases de excepciones en Delphi

A continuación os mostramos un listado de clases de excepciones de Borland Delphi 6:

EurekaLog para captura profesional de errores o excepciones en Delphi

En el siguiente artículo os mostramos qué es EurekaLog y cómo instalarlo y configurarlo para ser usado por los desarrolladores de Delphi, permitiendo mostrar una ventana cuando se produzca un error no capturado personalizada y con información avanzada: