Tag Archives: aplicacion

Gestión de Errores en ASP .NET: customErrors y Error Handling en Global.Asax

Uno de los aspectos más importantes a tener en cuenta cuando se pasa a producción una aplicación es como vas a tratar los posibles errores que ocurran en ella.

Por defecto, si no modificamos nada y ocurre un error sin controlar, la aplicación nos mostrará una página con el siguiente texto:

 

Server Error in ‘/’ Application.


Runtime Error

Description: An application error occurred on the server. The current custom error settings for this application prevent the details of the application error from being viewed remotely (for security reasons). It could, however, be viewed by browsers running on the local server machine. 

Details: To enable the details of this specific error message to be viewable on remote machines, please create a <customErrors> tag within a “web.config” configuration file located in the root directory of the current web application. This <customErrors> tag should then have its “mode” attribute set to “Off”.

 

 

Este mensaje nos indica que ha ocurrido un error y no se muestra al visitante debido a la configuración del Web.Config que por defecto viene así:

 

<configuration>
    <system.web>
        <customErrors mode="Off"/>
    </system.web>
</configuration>

La forma más rápida para poder ver el error es cambiar el “RemoteOnly” por “Off” pero esto no es para nada recomendable ya que muestra los errores a cualquier visitante de la web pudiendo poner en entredicho la seguridad del sistema.

La tercera configuración que permite el apartado “customErrors” es redirigir a una página específica de error y luego guardar el error en un fichero de log o base de datos o bien enviarlo por mail. 

 

Este tutorial explica cómo implementar esta última opción:

Primero: Modificamos el Web.Config para activar los errores personalizados para que redirija a la página “error.aspx”:

<configuration>
    <system.web>
        <customErrors mode="On" defaultRedirect="error.aspx"/>
    </system.web>
</configuration>

Segundo: Creamos la página “error.aspx” para indicar al usuario qué debe de hacer. Como ejemplo os dejo la página de error personalizada que hicimos en Domitienda.com:

Tercero: Sobreescribir el método “Application_Error()” del fichero “Global.asax” (si no tienes ese fichero en tu proyecto lo puedes agregar). Este método se ejecuta cada vez que ocurre un error sin capturar. En este ejemplo vamos a enviar un mail con el error para que podamos revisarlo y solventarlo cuanto antes:

 

void Application_Error(object sender, EventArgs e)
{

	try
	{
		//Obtenemos el error
		Exception ex = Server.GetLastError();

		//Formateamos el correo con los datos del error
		string bodyMail = "Error en Aplicación<br/>";
		bodyMail+= "<br/>Fecha: " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString();
		bodyMail+= "<br/>Descripción: " + ex.Message;
		bodyMail+= "<br/>Origen: " + ex.Source;
		bodyMail+= "<br/>Pila: " + ex.StackTrace;

		System.Net.Mail.MailMessage oMsg = new System.Net.Mail.MailMessage();
		oMsg.From = new System.Net.Mail.MailAddress("error@mydomain.com");
		oMsg.To.Add("webmaster@mydomain.com");
		oMsg.Subject = "Error en Aplicación";
		oMsg.Body = bodyMail;
		oMsg.IsBodyHtml = true;

		System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient("mail.mydomain.com");
		smtp.Credentials = new System.Net.NetworkCredential("error@mydomain.com","passCuentaCorreo");

		smtp.Send(oMsg);

		//Limpiamos el error 
		Server.ClearError();
	}
	catch(Exception errorEnEnvioDeError)
	{
		//En caso de fallar el envío de error podíamos probar un método alternativo como guardar "bodyMail" en un fichero de texto o en base de datos
	}
}

 

 

Con este sencillo método tendremos nuestra web protegida ante errores inesperados, el visitante verá una página de error más usable y el adminitrador de la web tendrá el mensaje de error en su buzón de correo inmediatamente para poder solventarlo cuanto antes.

Nos vemos Compilando!!