Manejo y captura de excepciones en ASP .NET

Por muy bien que programemos nuestra aplicación web siempre es posible que se lance alguna excepción que no estemos controlando, con la consiguiente pantalla de error en el navegador del usuario. Si no estamos capturando de ninguna manera esas excepciones, nunca nos enteraremos de que los usuarios están recibiendo errores de nuestra aplicación a no ser que se pongan en contacto con nosotros.

Para evitar que ocurra esto y poder corregir los errores lo más rápido posible, vamos a ver cómo manejar en ASP .NET las excepciones que no se capturan en la aplicación.

El tema es bastante sencillo.

Para empezar, tenemos que disponer en nuestra aplicación web de un archivo global.asax. Si no lo tenemos, podemos crearlo pinchando con el botón derecho en el proyecto web, después "Add New Item…" en el desplegable y, por último, seleccionamos "Global Application Class" como plantilla. Dejamos el nombre por defecto (global.asax) y pulsamos en "Add".

En el fichero global.asax que Visual Studio genera por defecto vemos unos cuantos métodos definidos (Application_Start, Application_End, …) sobre los que hablaremos en otro momento. En este caso, el que nos interesa es el método Application_Error.

El método Application_Error se ejecuta siempre que se produzca una excepción en nuestra aplicación y no se haya capturado. Este es el punto perfecto para guardar la excepción, por ejemplo, en un fichero de log junto con otros datos que pudieramos necesitar para reproducir el error (los datos de sesión o los de la petición actual por ejemplo). También podríamos enviarnos la excepción por e-mail, o las dos cosas a la vez.

En mi caso, utilizo log4net como herramienta para escribir los logs de mis aplicaciones y también me permite enviar los errores a una o varias direcciones de correo. En mi caso, el método Application_Error quedaría de la siguiente forma:

 
    void Application_Error(object sender, EventArgs e) 
    { 
       // Code that runs when an unhandled error occurs
       string message = Session["datos_de_sesion"].ToString();
       Log.Error(message, Server.GetLastError());
    }

Desde que utilizo este sistema, no hay ningún error que se me escape ;).

Nuestra puntuación
Twittear
Compartir
Compartir
Pin