Cómo: Controlar errores en una aplicación
Actualización: noviembre 2007
En este ejemplo de código se muestra cómo crear un controlador de errores en el archivo Global.asax que detecte todos los errores ASP.NET no controlados al procesar una solicitud, es decir, todos los errores que no se detectan con un bloque Try/Catch ni en un controlador de errores en el nivel de página. En el ejemplo, el controlador transfiere el control a una página de error genérica denominada Errors.aspx, que interpreta los errores y muestra los mensajes adecuados.
Ejemplo
' Handler in Global.asax file
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
Server.Transfer("Errors.aspx")
End Sub
' Handler in Errors.aspx file
Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim errMessage As System.Text.StringBuilder = _
New System.Text.StringBuilder()
Dim appException As System.Exception = Server.GetLastError()
If (TypeOf (appException) Is HttpException) Then
Dim checkException As HttpException = _
CType(appException, HttpException)
Select Case checkException.GetHttpCode
Case 403
errMessage.Append( _
"You are not allowed to view that page.")
Case 404
errMessage.Append( _
"The page you requested cannot be found.")
Case 408
errMessage.Append( _
"The request has timed out.")
Case 500
errMessage.Append( _
"The server cannot fulfill your request.")
Case Else
errMessage.Append( _
"The server has experienced an error.")
End Select
Else
' The exception was not an HttpException.
errMessage.AppendFormat( _
"The following error occurred<br />{0}", _
appException.ToString
End If
errMessage.Append("<br />Please contact the server administrator.")
Label1.Text = errMessage.ToString()
Server.ClearError()
End Sub
// Handler in Global.asax file
void Application_Error(Object sender, EventArgs e) {
Server.Transfer("Errors.aspx");
}
// Handler in Errors.aspx file.
protected void Page_Load(object sender, EventArgs e)
{
System.Text.StringBuilder errMessage = new StringBuilder();
System.Exception appException = Server.GetLastError();
if (appException is HttpException)
{
HttpException checkException = (HttpException)appException;
switch (checkException.GetHttpCode())
{
case 403:
{
errMessage.Append("You are not allowed to view that page.");
break;
}
case 404:
{
errMessage.Append("The page you requested cannot be found.");
break;
}
case 408:
{
errMessage.Append("The request has timed out");
break;
}
case 500:
{
errMessage.Append("The server cannot fullfill your request.");
break;
}
default:
{
errMessage.Append("Ther server has experienced an error.");
break;
}
}
}
else
{
// The exception was not an HttpException.
errMessage.AppendFormat("The following error occurred<br />{0}",
appException.ToString());
}
errMessage.Append("<br />Please contact the server administrator.");
Label1.Text = errMessage.ToString();
Server.ClearError();
}
Compilar el código
Para este ejemplo de código se necesita:
Una aplicación Web.
Una página de formularios Web Forms denominada Errors.aspx con un control Label denominado Label1.
Programación eficaz
Es preferible utilizar bloques Try/Catch alrededor de cualquier código sujeto a errores, en lugar de confiar en un controlador de errores global.
Un controlador de errores que se defina en el archivo Global.asax detectará sólo los errores que se produzcan durante el procesamiento de solicitudes por parte del motor en tiempo de ejecución de ASP.NET. Por ejemplo, detectará el error si un usuario solicita un archivo .aspx que no existe en la aplicación. Sin embargo, no capturará el error si el usuario solicita un archivo .htm inexistente. Para errores ajenos a ASP.NET, puede crear un controlador personalizado en Servicios de Internet Information Server (IIS). Tampoco se llamará al controlador personalizado para los errores del nivel de servidor.
No es posible mostrar información de errores de solicitudes directamente desde el archivo Global.asax: deberá transferir el control a otra página (normalmente, de formularios Web Forms). Para transferir el control a otra página, utilice el método Transfer. De esta forma se conserva el contexto actual, de modo que es posible obtener información del método GetLastError.
Después de controlar un error, deberá borrarlo mediante una llamada al método ClearError del objeto Server (clase HttpServerUtility).
Seguridad
Asegúrese de no mostrar información de error que pueda servirle a algún usuario malintencionado para comprometer el funcionamiento de la aplicación. Para obtener información detallada, vea Cómo: Mostrar mensajes de error seguros.