Cuando programamos una aplicación, aparte de hacer que ésta cumpla todos los requisitos puramente funcionales e implemente los algoritmos que sean necesarios, es igualmente imortante realizar un estudio sobre las posibles excepciones y errores que se puedan producir durante su ejecución. De este modo podremos responder elegantemente a estas situaciones, en lugar de permitir que nuestros usuarios vean un diálogo horroroso con detalles técnicos y se acabe la aplicación sin previo aviso.

Para ello añadimos cantidad de sentencias de gestión de excepciones try-catch-finally en todo el código, gestionando cada posible error o excepción.

Por muy bien que lo hagamos, sin embargo, siempre habrá cosas que se nos escapen y que produzcan el fatídico diálogo que mencionaba hace un momento. Para asegurarnos de que esto no ocurre podemos crear un gestor de errores universal que se ejecute de forma automática al producirse alguna excepción que no hemos gestionado adecuadamente.

Hacerlo es muy sencillo: basta con utilizar el método AddOnThreadException o la propiedad ThreadException de la clase Application. Este método recibe como argumento un delegado (puntero: palabra tabú) a una función con los parámetros adecuados que será la encargada de gestionar estos errores no atrapados. La definición estándar de esta función es:

void OnThreadException(object sender, ThreadExceptionEventArgs t)

Veamos un ejemplo:

Definimos una clase que albergará nuestro método gestor de excepciones universal:

public class MiCapturador
{
     public void MiErrorUniversal(object sender, ThreadExceptionEventArgs t)
    {
        //Aquí meto el código para gestionar la excepción...
        MessageBox.Show("Se ha producido un error");
    }
}

En este caso sólo muestro un diálogo mega-cutre, pero en una implementación real podríamos almacenar la información sobre el error en una base de datos o enviarla a un Servicio Web para estar inforamdos, además de mostrar un diálogo agradable al usuario informándole del evento.

Ahora que ya hemos definido el método, sólo resta asignarlo a la aplicación desde el método Main o en el evento OnLoad del primer formulario que se cargue, así:

MiCapturador micapt = new MiCapturador();
Application.ThreadException += new ThreadExceptionEventHandler(micapt.MiErrorUniversal);

Con esto conseguiríamos el efecto buscado. Este truco contribuye a crear aplicaciones estables y con calidad profesional.

OJO: no deberemos usar esto para ahorrarnos la gestión de las excepciones normales que debería haber en el programa. El código perezoso al final se acaba pagando caro ;-)

💪🏻 ¿Este post te ha ayudado?, ¿has aprendido algo nuevo?
Pues NO te pido que me invites a un café... Te pido algo más fácil y mucho mejor