Compartir a través de


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 de .NET de Microsoft Visual Basic para capturar 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 tradicionales del servidor activo (ASP). En ASP.NET, puede controlar los 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, controlará los 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 errores que pueden producirse al ejecutar una aplicación de ASP.NET. ASP.NET proporciona tres métodos principales que permiten capturar 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 ASP.NET. Aunque en este artículo se describe cómo proporcionar páginas de error personalizadas y informes generales de errores en relación directamente con ASP.NET, este artículo no describe 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 capturar errores que se producen en el nivel de página. Puede mostrar información de error (como hace el código de ejemplo que debe 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. Querrá 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 notifique que se ha producido un error y, a continuación, registrar realmente los detalles de error específicos en el registro de eventos.

En este ejemplo se produce una excepción nula, 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 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 Guardar PageEvent.aspx.

  4. Haga clic con el botón derecho en la página y, a continuación, haga clic en Ver en explorador para ejecutar la página. Observe que se produce el error 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 evita 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 capturar 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 pueden producirse.

El ejemplo que se va a 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 estaba atrapado en el Page_Error evento. El Application_Error evento se especifica en el archivo Global.asax de la aplicación. Para simplificar, los pasos de esta sección crean una nueva página en la que se inicia la excepción, capturan el error en Application_Error caso del archivo Global.asax y escriben 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 Guardar AppEvent.aspx.

  4. Agregue el Application_Error evento al archivo Global.asax para capturar el error que se produce en caso de la Page_Load 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, que es accesible desde el Visor de eventos. Después de registrar el error, es posible que desee 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 a 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 . Como resultado, el error se controla en el archivo Web.config como último punto para capturar 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 debería aparecer ahora similar al 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 aplicación y servidor web 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. Observe que cuando se produce el error, se le redirigirá a la página ErrorStatus.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 para redirigir a 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 piensa 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 o en algún otro enfoque antes de que tenga lugar el redireccionamiento.

Observe que la <customErrors> sección incluye un mode atributo establecido On en . El mode atributo se usa para controlar cómo se produce la redirección de errores. Por ejemplo, si va a desarrollar la aplicación, lo más probable es que quiera ver los mensajes de error de ASP.NET reales y no desea redirigirse 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 código de 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 versiones beta de ASP.NET, la identidad del proceso era System, una eficaz cuenta administrativa con muchos privilegios en la máquina.

En su instalación predeterminada en Windows Server (IIS), ASP.NET ejecuta código de 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 la ejecución del código en este artículo, así como otro código que podría necesitar derechos de acceso adicionales, consulte patrones y prácticas.

Referencias