Creación de páginas de informes de errores personalizadas en ASP.NET mediante Visual Basic .NET

En este artículo se describe cómo usar el código .NET de Microsoft Visual Basic para interceptar y responder a errores cuando se producen en ASP.NET.

Versión original del producto: Visual Basic .NET, ASP.NET
Número de KB original: 308132

Resumen

ASP.NET ha mejorado las opciones de control de errores de las páginas de Active Server (ASP) tradicionales. En ASP.NET, puede controlar errores en varios niveles diferentes en las aplicaciones.

Nuevas características de ASP.NET

ASP.NET ofrece varios avances en cómo puede controlar y responder a errores. En asp tradicional, se controlan errores con On Error Resume Next (o try-catch bloques en JScript). Como alternativa, si ejecuta Internet Information Services (IIS), use el ASPError objeto para crear una página de informes de errores personalizada. Sin embargo, estos enfoques tienen sus limitaciones.

ASP.NET proporciona varios niveles en los que puede controlar y responder a los errores que pueden producirse al ejecutar una aplicación de ASP.NET. ASP.NET proporciona tres métodos principales que permiten interceptar y responder a errores cuando se producen: el Page_Error evento, el Application_Error evento y el archivo de configuración de la aplicación (Web.config).

En este artículo se muestra cómo usar estas nuevas características en la aplicación de ASP.NET. Aunque en este artículo se describe cómo proporcionar páginas de error personalizadas e informes de errores generales, ya que se relacionan directamente con ASP.NET, en este artículo no se describen otros enfoques de control de errores, como el try-catch-finally bloque y el sistema de excepciones de Common Language Runtime (CLR).

Uso del evento Page_Error

El Page_Error evento proporciona una manera de interceptar los errores que se producen en el nivel de página. Puede mostrar información de error (como lo hace el código de ejemplo que se va a seguir) o puede registrar el evento o realizar alguna otra acción.

Nota:

En este ejemplo se muestra información detallada del error en el explorador solo con fines de demostración. Debe tener cuidado al mostrar información detallada al usuario final de la aplicación, especialmente cuando la aplicación se ejecuta en Internet. Una acción más adecuada sería mostrar un mensaje al usuario que le notifica que se ha producido un error y, a continuación, registrar realmente los detalles específicos del error en el registro de eventos.

En este ejemplo se produce una excepción null, que obliga a que se produzca un error en el Page_Load evento. Siga estos pasos para crear la página inicial que probará el Page_Error evento.

  1. Siga estos pasos para agregar un nuevo archivo denominado PageEvent.aspx al proyecto:

    1. Abra Visual Studio .NET.
    2. En Explorador de soluciones, haga clic con el botón derecho en el nodo del proyecto, seleccione Agregary, a continuación, haga clic en Agregar formulario web.
    3. En el cuadro de texto Nombre , escriba PageEvent.aspx y, a continuación, haga clic en Abrir.
  2. Agregue el código siguiente a PageEvent.aspx:

    <%@ Page Language="vb"%>
    <script runat=server>
        Sub Page_Load(Sender as object, e as EventArgs)
           throw(new System.ArgumentNullException())
        End Sub
        Sub Page_Error(Sender as object, e as EventArgs)
           Dim objErr as Exception = Server.GetLastError().GetBaseException()
           Dim err as String = "<b>Error Caught in Page_Error event</b><hr><br>" & _
                               "<br><b>Error in: </b>" & Request.Url.ToString() & _
                               "<br><b>Error Message: </b>" & objErr.Message.ToString() & _
                               "<br><b>Stack Trace:</b><br>" & _objErr.StackTrace.ToString()
           Response.Write(err.ToString())
           Server.ClearError()
        End Sub
    </script>
    
  3. En el menú Archivo , haga clic en GuardarPageEvent.aspx.

  4. Haga clic con el botón derecho en la página y, a continuación, haga clic en Ver en el explorador para ejecutar la página. Observe que el error se produce y se notifica según las especificaciones del código.

Nota:

Es posible que observe que el código emite una llamada a Server.ClearError. Esto impide que el error continúe con el Application_Error evento que se va a controlar.

Uso del evento Application_Error

De forma similar al Page_Error evento, puede usar el Application_Error evento para interceptar los errores que se producen en la aplicación. Debido al ámbito de toda la aplicación del evento, puede registrar la información de error de la aplicación o controlar otros errores de nivel de aplicación que puedan producirse.

El ejemplo que se debe seguir se basa en el ejemplo de código de evento anterior Page_Error y se desencadenaría si el error del Page_Load evento no estuviera atrapado en el Page_Error evento. El Application_Error evento se especifica en el archivo Global.asax de la aplicación. Por motivos de simplicidad, los pasos de esta sección crean una nueva página en la que se inicia la excepción, se captura el error en el Application_Error caso del archivo Global.asax y se escribe el error en el registro de eventos. En los pasos siguientes se muestra cómo usar el Application_Error evento:

  1. Agregue un nuevo archivo denominado AppEvent.aspx al proyecto.

  2. Agregue el código siguiente a AppEvent.aspx:

    <script language=vb runat="server">
         Sub Page_Load(Sender as object, e as EventArgs)
             throw(new ArgumentNullException())
         End Sub
    </script>
    
  3. En el menú Archivo , haga clic en GuardarAppEvent.aspx.

  4. Agregue el Application_Error evento al archivo Global.asax para interceptar el error que se produce en el Page_Load caso de la página de AppEvent.aspx . Tenga en cuenta que debe agregar una Imports instrucción para el System.Diagnostics espacio de nombres a Global.asax para usar el registro de eventos.

    Agregue el código siguiente al archivo Global.asax :

    Imports System.Diagnostics
    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        Dim objErr As Exception = Server.GetLastError().GetBaseException()
        Dim err As String = "Error Caught in Application_Error event" & _
                                System.Environment.NewLine & _
                                "Error in: " & Request.Url.ToString() & _
                                System.Environment.NewLine & _
                                "Error Message: " & objErr.Message.ToString() & _
                                System.Environment.NewLine & _
                                "Stack Trace:" & objErr.StackTrace.ToString()
        EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error)
        Server.ClearError()
        additional actions...
    End Sub
    
  5. Guarde el archivo Global.asax .

  6. En Visual Studio .NET, en el menú Compilar , haga clic en Compilar.

  7. Haga clic con el botón derecho en la página y, a continuación, haga clic en Ver en el explorador. En este caso, la página estará en blanco; sin embargo, debe observar que se ha agregado una nueva entrada en el registro de eventos. En este ejemplo se realiza una entrada en el registro de aplicaciones, a la que se puede acceder desde el Visor de eventos. Después de registrar el error, es posible que quiera redirigir al usuario a otra página de error más fácil de usar o realizar algunas acciones adicionales si es necesario.

Uso del archivo Web.config

Si no llama Server.ClearError o intercepta el error en el Page_Error evento o Application_Error , el error se controla en función de la configuración de la <customErrors> sección del archivo Web.config . En la <customErrors> sección , puede especificar una página de redireccionamiento como página de error predeterminada (defaultRedirect) o especificar en una página determinada basada en el código de error del Protocolo de transferencia de hipertexto (HTTP) que se genera. Puede usar este método para personalizar el mensaje de error que recibe el usuario.

Si se produce un error que no está atrapado en ninguno de los niveles anteriores de la aplicación, se muestra esta página personalizada. En esta sección se muestra cómo modificar el archivo Global.asax para que Server.ClearError nunca se llame a él. Como resultado, el error se controla en el archivo Web.config como último punto para interceptar el error.

  1. Abra el archivo Global.asax del ejemplo anterior.

  2. Comente la Server.ClearError línea para asegurarse de que el error aparece en el archivo Web.config .

  3. Guarde los cambios en Global.asax. El código ahora debería parecerse a lo siguiente:

     Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
         Dim objErr As Exception = Server.GetLastError().GetBaseException()
         Dim err As String = "Error Caught in Application_Error event" & _
                             System.Environment.NewLine & _
                             "Error in: " & Request.Url.ToString() & _
                             System.Environment.NewLine & _
                             "Error Message: " & objErr.Message.ToString() & _
                             System.Environment.NewLine & _
                             "Stack Trace:" & objErr.StackTrace.ToString()
         EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error)
         Server.ClearError()
         additional actions...
     End Sub
    
  4. Agregue el código siguiente a la <customErrors> sección para redirigir al usuario a una página personalizada:

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
    </customErrors>
    

    Nota:

    Debe modificar la ruta de acceso del archivo en defaultRedirect el atributo para que haga referencia a los nombres de servidor web y de aplicación pertinentes.

  5. Dado que los errores que están atrapados en este nivel se envían a una página de error predeterminada, debe crear una página de error denominada ErrorStatus.htm. Tenga en cuenta que usa este método para controlar lo que se presenta al usuario, por lo que en este ejemplo se usa una página de.htm para la página de error. Agregue el código siguiente a ErrorStatus.htm:

    <HTML>
        <HEAD>
            <TITLE></TITLE>
            <META NAME="GENERATOR" Content="Microsoft Visual Studio 7.0">
        </HEAD>
        <BODY>
             <b>Custom Error page!</b>
             <br>
             You have been redirected here from the <customErrors> section of the
             Web.config file.
        </BODY>
    </HTML>
    
  6. Para probar el código, guarde los archivos, compile el proyecto y, a continuación, vea AppEvent.aspx en el explorador. Tenga en cuenta que cuando se produce el error, se le redirige a la página deErrorStatus.htm . Aunque puede hacer referencia a una página de error predeterminada en el valor del defaultRedirect atributo de la <customErrors> sección , también puede especificar una página determinada a la que redirigir en función del código de error HTTP que se genera. El <error> elemento secundario permite esta opción. Por ejemplo:

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
        <error statusCode="404" redirect="filenotfound.htm"/>
    </customErrors>
    

Nota:

La página especificada en defaultRedirect de la <customErrors> sección es un archivo .htm . Si tiene previsto usar GetLastError en una página de .aspx (lo que hacen los Page_Error ejemplos y Application_Error ), debe almacenar la excepción en una variable de sesión u otro enfoque antes de que se produzca el redireccionamiento.

Observe que la <customErrors> sección incluye un mode atributo establecido en On . El mode atributo se usa para controlar cómo se produce el redireccionamiento de errores. Por ejemplo, si está desarrollando la aplicación, lo más probable es que quiera ver los mensajes de error ASP.NET reales y no desea que se le redirija a la página de error más fácil de usar. El mode atributo incluye la siguiente configuración:

  • On: las excepciones no controladas redirigen al usuario a la página especificada defaultRedirect . Esto mode se usa principalmente en producción.

  • Off: los usuarios reciben la información de excepción y no se redirigen a la defaultRedirect página. Esto mode se usa principalmente en el desarrollo.

  • RemoteOnly: solo los usuarios que acceden al sitio en el equipo local (mediante localhost) reciben la información de excepción. Todos los demás usuarios se redirigen a la defaultRedirect página. Este modo se usa principalmente para la depuración.

Solución de problemas

En su instalación predeterminada en Windows, ASP.NET ejecuta el código de la aplicación web en un proceso de trabajo. La identidad de este proceso tiene como valor predeterminado una cuenta local sin privilegios denominada cuenta ASPNET . En las versiones beta de ASP.NET, la identidad del proceso era System, una cuenta administrativa eficaz con muchos privilegios en la máquina.

En su instalación predeterminada en Windows Server (IIS), ASP.NET ejecuta el código de la aplicación web en un proceso de trabajo. La identidad de este proceso tiene como valor predeterminado una cuenta limitada denominada NetworkService.

Para obtener más información sobre este cambio y cómo puede afectar a la ejecución del código en este artículo, así como otro código que podría necesitar derechos de acceso adicionales, vea patrones & prácticas

Referencias