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.
Siga estos pasos para agregar un nuevo archivo denominado PageEvent.aspx al proyecto:
- Abra Visual Studio .NET.
- 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.
- En el cuadro de texto Nombre , escriba PageEvent.aspx y haga clic en Abrir.
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>
En el menú Archivo , haga clic en Guardar PageEvent.aspx.
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 :
Agregue un nuevo archivo denominado AppEvent.aspx al proyecto.
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>
En el menú Archivo , haga clic en Guardar AppEvent.aspx.
Agregue el
Application_Error
evento al archivo Global.asax para capturar el error que se produce en caso de laPage_Load
página de AppEvent.aspx . Tenga en cuenta que debe agregar unaImports
instrucción para elSystem.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
Guarde el archivo Global.asax .
En Visual Studio .NET, en el menú Compilar , haga clic en Compilar.
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.
Abra el archivo Global.asax del ejemplo anterior.
Comente la
Server.ClearError
línea para asegurarse de que el error aparece en el archivo Web.config .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
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.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>
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 especificadadefaultRedirect
. Estomode
se usa principalmente en producción.Off
: los usuarios reciben la información de excepción y no se redirigen a ladefaultRedirect
página. Estomode
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 ladefaultRedirect
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.