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.
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, a continuación, 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 GuardarPageEvent.aspx.
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:
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 GuardarAppEvent.aspx.
Agregue el
Application_Error
evento al archivo Global.asax para interceptar el error que se produce en elPage_Load
caso de la 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, 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.
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 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
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.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. 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 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 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
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de