control de errores de ASP.NET

por Erik Reitan

Descargar Wingtip Toys Proyecto de Ejemplo (C#) o Descargar eBook (PDF)

Esta serie de tutoriales le enseñará los conceptos básicos para crear una aplicación con formularios web ASP.NET utilizando ASP.NET 4.5 y Microsoft Visual Studio Express 2013 para Web. Un proyecto de Visual Studio 2013 con código fuente de C# está disponible para acompañar a esta serie de tutoriales.

En este tutorial, modificará la aplicación de ejemplo Wingtip Toys para incluir el control de errores y el registro de errores. El control de errores permitirá que la aplicación controle correctamente los errores y muestre los mensajes de error en consecuencia. El registro de errores le permitirá buscar y corregir errores que se han producido. Este tutorial se basa en el tutorial anterior "Enrutamiento de direcciones URL" y forma parte de la serie de tutoriales wingtip Toys.

Lo que aprenderá:

  • Cómo agregar el control global de errores a la configuración de la aplicación.
  • Cómo agregar el control de errores en los niveles de aplicación, página y código.
  • Cómo registrar errores para su revisión posterior.
  • Cómo mostrar mensajes de error que no ponen en peligro la seguridad.
  • Cómo implementar los módulos y controladores de registro de errores (ELMAH).

Visión general

ASP.NET las aplicaciones deben poder controlar los errores que se producen durante la ejecución de forma coherente. ASP.NET usa Common Language Runtime (CLR), que proporciona una manera de notificar a las aplicaciones de errores de forma uniforme. Cuando se produce un error, se produce una excepción. Una excepción es cualquier error, condición o comportamiento inesperado que encuentre una aplicación.

En .NET Framework, una excepción es un objeto que hereda de la System.Exception clase . Se lanza una excepción desde una sección de código donde ha ocurrido un problema. La excepción se pasa por la pila de llamadas hasta donde la aplicación proporciona el código para manejar la excepción. Si la aplicación no controla la excepción, el explorador se ve obligado a mostrar los detalles del error.

Como procedimiento recomendado, maneje los errores a nivel de código en bloques Try/Catch/Finally. Intente colocar estos bloques para que el usuario pueda corregir problemas en el contexto en el que se producen. Si los bloques de control de errores están demasiado lejos de donde se produjo el error, resulta más difícil proporcionar a los usuarios la información que necesitan para corregir el problema.

Clase de excepción

La clase Exception es la clase base de la que heredan las excepciones. La mayoría de los objetos de excepción son instancias de alguna clase derivada de la clase Exception, como la SystemException clase, la IndexOutOfRangeException clase o la ArgumentNullException clase . La clase Exception tiene propiedades, como la StackTrace propiedad , la InnerException propiedad y la Message propiedad , que proporcionan información específica sobre el error que se ha producido.

Jerarquía de herencia de excepciones

El tiempo de ejecución tiene un conjunto base de excepciones derivadas de la SystemException clase que produce el tiempo de ejecución cuando se encuentra una excepción. La mayoría de las clases que heredan de la clase Exception, como la IndexOutOfRangeException clase y la ArgumentNullException clase, no implementan miembros adicionales. Por lo tanto, la información más importante de una excepción se puede encontrar en la jerarquía de excepciones, el nombre de la excepción y la información contenida en la excepción.

Jerarquía de control de excepciones

En una aplicación de formularios web Forms de ASP.NET, las excepciones se pueden controlar en función de una jerarquía de control específica. Se puede controlar una excepción en los siguientes niveles:

  • Nivel de aplicación
  • Nivel de página
  • Nivel de código

Cuando una aplicación controla las excepciones, la información adicional sobre la excepción que se hereda de la clase Exception se puede recuperar y mostrar al usuario a menudo. Además de la aplicación, la página y el nivel de código, también puede controlar las excepciones en el nivel de módulo HTTP y mediante un controlador personalizado de IIS.

Control de errores de nivel de aplicación

Puede controlar los errores predeterminados en el nivel de aplicación modificando la configuración de la aplicación o agregando un Application_Error controlador en el archivo Global.asax de la aplicación.

Puede controlar los errores predeterminados y los errores HTTP agregando una customErrors sección al archivo Web.config . La customErrors sección permite especificar una página predeterminada a la que se redirigirán los usuarios cuando se produzca un error. También permite especificar páginas individuales para errores de código de estado específicos.

<configuration>
  <system.web>
    <customErrors mode="On" defaultRedirect="ErrorPage.aspx?handler=customErrors%20section%20-%20Web.config">
      <error statusCode="404" redirect="ErrorPage.aspx?msg=404&amp;handler=customErrors%20section%20-%20Web.config"/>
    </customErrors>
  </system.web>
</configuration>

Desafortunadamente, cuando se usa la configuración para redirigir al usuario a una página diferente, no tiene los detalles del error que se produjo.

Sin embargo, puede interceptar errores que se producen en cualquier parte de la aplicación agregando código al Application_Error controlador en el archivo Global.asax .

void Application_Error(object sender, EventArgs e)
{
    Exception exc = Server.GetLastError();

    if (exc is HttpUnhandledException)
    {
        // Pass the error on to the error page.
        Server.Transfer("ErrorPage.aspx?handler=Application_Error%20-%20Global.asax", true);
    }
}

Gestión de eventos de error a nivel de página

Un controlador de nivel de página devuelve al usuario a la página donde se produjo el error, pero dado que no se mantienen instancias de controles, ya no habrá nada en la página. Para proporcionar los detalles del error al usuario de la aplicación, debe escribir específicamente los detalles del error en la página.

Normalmente, usaría un controlador de errores de nivel de página para registrar errores no controlados o para llevar al usuario a una página que pueda mostrar información útil.

En este ejemplo de código se muestra un controlador para el evento Error en una página web de ASP.NET. Este controlador detecta todas las excepciones que no se han gestionado dentro de los bloques try/catch de la página.

private void Page_Error(object sender, EventArgs e)
{
    Exception exc = Server.GetLastError();

    // Handle specific exception.
    if (exc is HttpUnhandledException)
    {
        ErrorMsgTextBox.Text = "An error occurred on this page. Please verify your " +                  
        "information to resolve the issue."
    }
    // Clear the error from the server.
    Server.ClearError();
}

Después de controlar un error, debe borrarlo llamando al ClearError método del objeto Server (HttpServerUtility clase), de lo contrario, se mostrará un error ocurrido anteriormente.

Control de errores de nivel de código

La instrucción try-catch consta de un bloque de prueba seguido de una o varias cláusulas catch, que especifican controladores para distintas excepciones. Cuando se produce una excepción, Common Language Runtime (CLR) busca la instrucción catch que controla esta excepción. Si el método que se está ejecutando actualmente no contiene un bloque catch, el CLR examina el método que llamó al método actual y continúa subiendo por la pila de llamadas. Si no se encuentra ningún bloque catch, CLR muestra un mensaje de excepción no controlado al usuario y detiene la ejecución del programa.

En el ejemplo de código siguiente se muestra una forma común de usar try/catch/finally para controlar errores.

try
{
    file.ReadBlock(buffer, index, buffer.Length);
}
catch (FileNotFoundException e)
{
    Server.Transfer("NoFileErrorPage.aspx", true);
}
catch (System.IO.IOException e)
{
    Server.Transfer("IOErrorPage.aspx", true);
}

finally
{
    if (file != null)
    {
        file.Close();
    }
}

En el código anterior, el bloque try contiene el código que debe protegerse frente a una posible excepción. El bloque se ejecuta hasta que se produce una excepción o el bloque se completa correctamente. Si se produce una FileNotFoundException excepción o una IOException excepción, la ejecución se transfiere a otra página. A continuación, se ejecuta el código contenido en el bloque finally, independientemente de si se produjo o no un error.

Adición de soporte para el registro de errores

Antes de añadir el manejo de errores a la aplicación de ejemplo Wingtip Toys, añadirá compatibilidad con el registro de errores al añadir una clase ExceptionUtility a la carpeta Logic. Al hacerlo, cada vez que la aplicación controla un error, los detalles del error se agregarán al archivo de registro de errores.

  1. Haga clic con el botón derecho en la carpeta Lógica y seleccione Agregar ->Nuevo elemento.
    Se muestra el cuadro de diálogo Agregar nuevo elemento .

  2. Seleccione el grupo Visual C# ->Code templates (Plantillas de código de Visual C#) a la izquierda. A continuación, seleccione Claseen la lista central y asígnela el nombre ExceptionUtility.cs.

  3. Elija Agregar. Se muestra el nuevo archivo de clase.

  4. Reemplace el código existente por el siguiente:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.IO;
    
    namespace WingtipToys.Logic
    {
      // Create our own utility for exceptions
      public sealed class ExceptionUtility
      {
        // All methods are static, so this can be private
        private ExceptionUtility()
        { }
    
        // Log an Exception
        public static void LogException(Exception exc, string source)
        {
          // Include logic for logging exceptions
          // Get the absolute path to the log file
          string logFile = "~/App_Data/ErrorLog.txt";
          logFile = HttpContext.Current.Server.MapPath(logFile);
    
          // Open the log file for append and write the log
          StreamWriter sw = new StreamWriter(logFile, true);
          sw.WriteLine("********** {0} **********", DateTime.Now);
          if (exc.InnerException != null)
          {
            sw.Write("Inner Exception Type: ");
            sw.WriteLine(exc.InnerException.GetType().ToString());
            sw.Write("Inner Exception: ");
            sw.WriteLine(exc.InnerException.Message);
            sw.Write("Inner Source: ");
            sw.WriteLine(exc.InnerException.Source);
            if (exc.InnerException.StackTrace != null)
            {
              sw.WriteLine("Inner Stack Trace: ");
              sw.WriteLine(exc.InnerException.StackTrace);
            }
          }
          sw.Write("Exception Type: ");
          sw.WriteLine(exc.GetType().ToString());
          sw.WriteLine("Exception: " + exc.Message);
          sw.WriteLine("Source: " + source);
          sw.WriteLine("Stack Trace: ");
          if (exc.StackTrace != null)
          {
            sw.WriteLine(exc.StackTrace);
            sw.WriteLine();
          }
          sw.Close();
        }
      }
    }
    

Cuando se produce una excepción, la excepción se puede escribir en un archivo de registro de excepciones llamando al LogException método . Este método toma dos parámetros, el objeto de excepción y una cadena que contiene detalles sobre el origen de la excepción. El registro de excepciones se escribe en el archivo ErrorLog.txt en la carpeta App_Data .

Agregar una página de error

En la aplicación de ejemplo Wingtip Toys, se usará una página para mostrar errores. La página de error está diseñada para mostrar un mensaje de error seguro a los usuarios del sitio. Sin embargo, si el usuario es un desarrollador que realiza una solicitud HTTP que se atiende localmente en el equipo donde reside el código, se mostrarán detalles de error adicionales en la página de error.

  1. Haga clic con el botón derecho en el nombre del proyecto (Wingtip Toys) en el Explorador de soluciones y seleccione Agregar ->Nuevo elemento.
    Se muestra el cuadro de diálogo Agregar nuevo elemento .

  2. Seleccione en la izquierda el grupo Visual C# ->plantillas web. En la lista central, seleccione Formulario web con página maestra y asígnelo el nombre ErrorPage.aspx.

  3. Haga clic en Agregar.

  4. Seleccione el archivo Site.Master como página maestra y, a continuación, elija Aceptar.

  5. Reemplace el marcado existente por lo siguiente:

    <%@ Page Title="" Language="C#" AutoEventWireup="true" MasterPageFile="~/Site.Master"  CodeBehind="ErrorPage.aspx.cs" Inherits="WingtipToys.ErrorPage" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
        <h2>Error:</h2>
        <p></p>
        <asp:Label ID="FriendlyErrorMsg" runat="server" Text="Label" Font-Size="Large" style="color: red"></asp:Label>
    
        <asp:Panel ID="DetailedErrorPanel" runat="server" Visible="false">
            <p>&nbsp;</p>
            <h4>Detailed Error:</h4>
            <p>
                <asp:Label ID="ErrorDetailedMsg" runat="server" Font-Size="Small" /><br />
            </p>
    
            <h4>Error Handler:</h4>
            <p>
                <asp:Label ID="ErrorHandler" runat="server" Font-Size="Small" /><br />
            </p>
    
            <h4>Detailed Error Message:</h4>
            <p>
                <asp:Label ID="InnerMessage" runat="server" Font-Size="Small" /><br />
            </p>
            <p>
                <asp:Label ID="InnerTrace" runat="server"  />
            </p>
        </asp:Panel>
    </asp:Content>
    
  6. Reemplace el código existente del código subyacente (ErrorPage.aspx.cs) para que aparezca de la siguiente manera:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using WingtipToys.Logic;
    
    namespace WingtipToys
    {
      public partial class ErrorPage : System.Web.UI.Page
      {
        protected void Page_Load(object sender, EventArgs e)
        {
          // Create safe error messages.
          string generalErrorMsg = "A problem has occurred on this web site. Please try again. " +
              "If this error continues, please contact support.";
          string httpErrorMsg = "An HTTP error occurred. Page Not found. Please try again.";
          string unhandledErrorMsg = "The error was unhandled by application code.";
    
          // Display safe error message.
          FriendlyErrorMsg.Text = generalErrorMsg;
    
          // Determine where error was handled.
          string errorHandler = Request.QueryString["handler"];
          if (errorHandler == null)
          {
            errorHandler = "Error Page";
          }
    
          // Get the last error from the server.
          Exception ex = Server.GetLastError();
    
          // Get the error number passed as a querystring value.
          string errorMsg = Request.QueryString["msg"];
          if (errorMsg == "404")
          {
            ex = new HttpException(404, httpErrorMsg, ex);
            FriendlyErrorMsg.Text = ex.Message;
          }
    
          // If the exception no longer exists, create a generic exception.
          if (ex == null)
          {
            ex = new Exception(unhandledErrorMsg);
          }
    
          // Show error details to only you (developer). LOCAL ACCESS ONLY.
          if (Request.IsLocal)
          {
            // Detailed Error Message.
            ErrorDetailedMsg.Text = ex.Message;
    
            // Show where the error was handled.
            ErrorHandler.Text = errorHandler;
    
            // Show local access details.
            DetailedErrorPanel.Visible = true;
    
            if (ex.InnerException != null)
            {
              InnerMessage.Text = ex.GetType().ToString() + "<br/>" +
                  ex.InnerException.Message;
              InnerTrace.Text = ex.InnerException.StackTrace;
            }
            else
            {
              InnerMessage.Text = ex.GetType().ToString();
              if (ex.StackTrace != null)
              {
                InnerTrace.Text = ex.StackTrace.ToString().TrimStart();
              }
            }
          }
    
          // Log the exception.
          ExceptionUtility.LogException(ex, errorHandler);
    
          // Clear the error from the server.
          Server.ClearError();
        }
      }
    }
    

Cuando se muestra la página de error, se ejecuta el Page_Load controlador de eventos. En el Page_Load controlador, se determina la ubicación de donde se ha controlado el error por primera vez. A continuación, el último error que se produjo se determina mediante una llamada al GetLastError método del objeto Server. Si la excepción ya no existe, se crea una excepción genérica. A continuación, si la solicitud HTTP se realizó localmente, se muestran todos los detalles del error. En este caso, solo la máquina local que ejecuta la aplicación web verá estos detalles de error. Una vez mostrada la información de error, el error se agrega al archivo de registro y el error se borra del servidor.

Visualización de mensajes de error no controlados para la aplicación

Al agregar una customErrors sección al archivo Web.config , puede controlar rápidamente los errores simples que se producen en toda la aplicación. También puede especificar cómo controlar los errores en función de su valor de código de estado, como 404 - Archivo no encontrado.

Actualizar la configuración

Actualice la configuración agregando una customErrors sección al archivo Web.config .

  1. En el Explorador de soluciones, busque y abra el archivo Web.config en la raíz de la aplicación de ejemplo Wingtip Toys.

  2. Agregue la customErrors sección al archivo Web.config dentro del nodo <system.web> de la siguiente manera:

    <configuration>
      <system.web>
        <customErrors mode="On" defaultRedirect="ErrorPage.aspx?handler=customErrors%20section%20-%20Web.config">
          <error statusCode="404" redirect="ErrorPage.aspx?msg=404&amp;handler=customErrors%20section%20-%20Web.config"/>
        </customErrors>
      </system.web>
    </configuration>
    
  3. Guarde el archivo Web.config .

La customErrors sección especifica el modo , que se establece en "Activado". También especifica el defaultRedirect, que indica a la aplicación a qué página navegar cuando se produce un error. Además, ha agregado un elemento de error específico que especifica cómo controlar un error 404 cuando no se encuentra una página. Más adelante en este tutorial, agregará control de errores adicional que capturará los detalles de un error en el nivel de aplicación.

Ejecutar la aplicación

Ahora puede ejecutar la aplicación para ver las rutas actualizadas.

  1. Presione F5 para ejecutar la aplicación de ejemplo Wingtip Toys.
    El explorador se abre y muestra la página Default.aspx .

  2. Escriba la siguiente dirección URL en el explorador (asegúrese de usar el número de puerto):
    https://localhost:44300/NoPage.aspx

  3. Revise el ErrorPage.aspx que se muestra en el explorador.

    control de errores de ASP.NET: error de página no encontrado

Cuando solicite la página de NoPage.aspx , que no existe, la página de error mostrará el mensaje de error simple y la información detallada del error si hay detalles adicionales disponibles. Sin embargo, si el usuario solicitó una página inexistente desde una ubicación remota, la página de error solo mostraría el mensaje de error en rojo.

Incluir una excepción con fines de prueba

Para comprobar cómo funcionará la aplicación cuando se produzca un error, puede crear deliberadamente condiciones de error en ASP.NET. En la aplicación de ejemplo Wingtip Toys, lanzará una excepción de prueba cuando se cargue la página predeterminada para ver qué sucede.

  1. Abra el código subyacente de la página de Default.aspx en Visual Studio.
    Se mostrará la página de código subyacente Default.aspx.cs.

  2. En el controlador, agregue código para que el controlador aparezca de la siguiente manera: Page_Load

    protected void Page_Load(object sender, EventArgs e)
    {
        throw new InvalidOperationException("An InvalidOperationException " +
        "occurred in the Page_Load handler on the Default.aspx page.");
    }
    

Es posible crear varios tipos diferentes de excepciones. En el código anterior, va a crear un InvalidOperationException cuando se carga la página Default.aspx .

Ejecutar la aplicación

Puede ejecutar la aplicación para ver cómo controla la aplicación la excepción.

  1. Presione CTRL+F5 para ejecutar la aplicación de ejemplo Wingtip Toys.
    La aplicación lanza la excepción InvalidOperationException.

    Nota:

    Debe presionar CTRL+F5 para mostrar la página sin dividir el código para ver el origen del error en Visual Studio.

  2. Revise el ErrorPage.aspx que se muestra en el explorador.

    ASP.NET control de errores: página Error

Como puede ver en los detalles del error, la excepción se ha atrapado en la customError sección del archivo Web.config .

Agregar manejo de errores a nivel de aplicación

En lugar de interceptar la excepción mediante la customErrors sección del archivo Web.config , donde obtendrá poca información sobre la excepción, puede interceptar el error en el nivel de aplicación y recuperar los detalles del error.

  1. En el Explorador de soluciones, busque y abra el archivo Global.asax.cs .

  2. Agregue un controlador de Application_Error para que aparezca de la siguiente manera:

    void Application_Error(object sender, EventArgs e)
    {
      // Code that runs when an unhandled error occurs.
    
      // Get last error from the server
      Exception exc = Server.GetLastError();
    
      if (exc is HttpUnhandledException)
      {
        if (exc.InnerException != null)
        {
          exc = new Exception(exc.InnerException.Message);
          Server.Transfer("ErrorPage.aspx?handler=Application_Error%20-%20Global.asax",
              true);
        }
      }
    }
    

Cuando se produce un error en la aplicación, se llama al Application_Error controlador. En este controlador, se recupera y revisa la última excepción. Si la excepción no se ha controlado y la excepción contiene detalles de excepción interna (es decir, InnerException no es null), la aplicación transfiere la ejecución a la página de error donde se muestran los detalles de la excepción.

Ejecutar la aplicación

Puede ejecutar la aplicación para ver los detalles de error adicionales proporcionados mediante el control de la excepción en el nivel de aplicación.

  1. Presione CTRL+F5 para ejecutar la aplicación de ejemplo Wingtip Toys.
    La aplicación lanza el InvalidOperationException.

  2. Revise el ErrorPage.aspx que se muestra en el explorador.

    control de errores de ASP.NET: error de nivel de aplicación

Control de errores a nivel de página

Puede agregar el control de errores de nivel de página a una página mediante la adición de un ErrorPage atributo a la @Page directiva de la página o agregando un Page_Error controlador de eventos al código subyacente de una página. En esta sección, agregará un Page_Error controlador de eventos que transferirá la ejecución a la página ErrorPage.aspx .

  1. En el Explorador de soluciones, busque y abra el archivo Default.aspx.cs .

  2. Agregue un Page_Error controlador para que el código subyacente aparezca de la siguiente manera:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace WingtipToys
    {
      public partial class _Default : Page
      {
        protected void Page_Load(object sender, EventArgs e)
        {
          throw new InvalidOperationException("An InvalidOperationException " +
          "occurred in the Page_Load handler on the Default.aspx page.");
        }
    
        private void Page_Error(object sender, EventArgs e)
        {
          // Get last error from the server.
          Exception exc = Server.GetLastError();
    
          // Handle specific exception.
          if (exc is InvalidOperationException)
          {
            // Pass the error on to the error page.
            Server.Transfer("ErrorPage.aspx?handler=Page_Error%20-%20Default.aspx",
                true);
          }
        }
      }
    }
    

Cuando se produce un error en la página, se llama al Page_Error controlador de eventos. En este controlador, se recupera y revisa la última excepción. Si se produce un InvalidOperationException, el controlador de eventos Page_Error transfiere la ejecución a la página de error donde se muestran los detalles de la excepción.

Ejecutar la aplicación

Ahora puede ejecutar la aplicación para ver las rutas actualizadas.

  1. Presione CTRL+F5 para ejecutar la aplicación de ejemplo Wingtip Toys.
    La aplicación lanza el InvalidOperationException.

  2. Revise el ErrorPage.aspx que se muestra en el explorador.

    control de errores de ASP.NET: error de nivel de página

  3. Cierre la ventana del explorador.

Quitar la excepción usada para las pruebas

Para permitir que la aplicación de ejemplo Wingtip Toys funcione sin lanzar la excepción que agregó anteriormente en este tutorial, elimine la excepción.

  1. Abra el código subyacente de la página Default.aspx .

  2. En el Page_Load controlador, quite el código que produce la excepción para que el controlador aparezca de la siguiente manera:

    protected void Page_Load(object sender, EventArgs e)
    {
    
    }
    

Agregar registro de errores a nivel de código

Como se mencionó anteriormente en este tutorial, puede agregar instrucciones try/catch para intentar ejecutar una sección de código y controlar el primer error que se produce. En este ejemplo, solo escribirá los detalles del error en el archivo de registro de errores para que el error se pueda revisar más adelante.

  1. En el Explorador de soluciones, en la carpeta Logic , busque y abra el archivo PayPalFunctions.cs .

  2. Actualice el método HttpCall para que el código aparezca de la siguiente manera:

    public string HttpCall(string NvpRequest)
    {
      string url = pEndPointURL;
    
      string strPost = NvpRequest + "&" + buildCredentialsNVPString();
      strPost = strPost + "&BUTTONSOURCE=" + HttpUtility.UrlEncode(BNCode);
    
      HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url);
      objRequest.Timeout = Timeout;
      objRequest.Method = "POST";
      objRequest.ContentLength = strPost.Length;
    
      try
      {
        using (StreamWriter myWriter = new StreamWriter(objRequest.GetRequestStream()))
        {
          myWriter.Write(strPost);
        }
      }
      catch (Exception e)
      {
        // Log the exception.
        WingtipToys.Logic.ExceptionUtility.LogException(e, "HttpCall in PayPalFunction.cs");
      }
    
      //Retrieve the Response returned from the NVP API call to PayPal.
      HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
      string result;
      using (StreamReader sr = new StreamReader(objResponse.GetResponseStream()))
      {
        result = sr.ReadToEnd();
      }
    
      return result;
    }
    

El código anterior llama al LogException método contenido en la ExceptionUtility clase . Ha agregado el archivo de clase ExceptionUtility.cs a la carpeta Logic anteriormente en este tutorial. El LogException método toma dos parámetros. El primer parámetro es el objeto de excepción. El segundo parámetro es una cadena que se usa para reconocer el origen del error.

Inspección de la información de registro de errores

Como se mencionó anteriormente, puede usar el registro de errores para determinar qué errores de la aplicación se deben corregir primero. Por supuesto, solo se registrarán los errores que se hayan capturado y registrado en el registro de errores.

  1. En el Explorador de soluciones, busque y abra el archivo ErrorLog.txt en la carpeta App_Data .
    Es posible que tenga que seleccionar la opción "Mostrar todos los archivos" o la opción "Actualizar" en la parte superior del Explorador de soluciones para ver el archivo ErrorLog.txt .

  2. Revise el registro de errores que se muestra en Visual Studio:

    Control de errores de ASP.NET: ErrorLog.txt

Mensajes de error seguros

Es importante tener en cuenta que cuando la aplicación muestra mensajes de error, no debe entregar información que un usuario malintencionado podría resultar útil para atacar la aplicación. Por ejemplo, si la aplicación intenta sin éxito escribir en una base de datos, no debe mostrar un mensaje de error que incluya el nombre de usuario que está utilizando. Por este motivo, se muestra un mensaje de error genérico en rojo al usuario. Todos los detalles de error adicionales solo se muestran al desarrollador en el equipo local.

Uso de ELMAH

ELMAH (Módulos y controladores de registro de errores) es una instalación de registro de errores que conectas a tu aplicación de ASP.NET como un paquete NuGet. ELMAH proporciona las siguientes funcionalidades:

  • Registro de excepciones no controladas.
  • Página web que permite ver todo el registro de excepciones no controladas registradas.
  • Página web para ver los detalles completos de cada excepción registrada.
  • Una notificación por correo electrónico de cada error en el momento en que se produce.
  • Fuente RSS de los últimos 15 errores del registro.

Para poder trabajar con el ELMAH, debe instalarlo. Esto es fácil de usar el instalador del paquete NuGet . Como se mencionó anteriormente en esta serie de tutoriales, NuGet es una extensión de Visual Studio que facilita la instalación y actualización de bibliotecas y herramientas de código abierto en Visual Studio.

  1. En Visual Studio, en el menú Herramientas, seleccione Administrador de paquetes NuGet>Administrar paquetes NuGet para la solución.

    control de errores de ASP.NET: administración de paquetes NuGet para la solución

  2. El cuadro de diálogo Administrar paquetes NuGet se muestra en Visual Studio.

  3. En el cuadro de diálogo Administrar paquetes NuGet , expanda En línea a la izquierda y, a continuación, seleccione nuget.org. A continuación, busque e instale el paquete ELMAH en la lista de paquetes disponibles en línea.

    control de errores de ASP.NET: paquete NuGet ELMA

  4. Tendrá que tener una conexión a Internet para descargar el paquete.

  5. En el cuadro de diálogo Seleccionar proyectos , asegúrese de que la selección WingtipToys está seleccionada y, a continuación, haga clic en Aceptar.

    ASP.NET control de errores: cuadro de diálogo Seleccionar proyectos

  6. Haga clic en Cerrar en el cuadro de diálogo Administrar paquetes NuGet si es necesario.

  7. Si Visual Studio solicita que vuelva a cargar los archivos abiertos, seleccione "Sí a todos".

  8. El paquete ELMAH agrega entradas para sí mismas en el archivo Web.config en la raíz del proyecto. Si Visual Studio le pregunta si desea volver a cargar el archivo deWeb.config modificado, haga clic en .

ELMAH ya está listo para almacenar los errores no controlados que se producen.

Visualización del registro ELMAH

Ver el registro de ELMAH es fácil, pero primero crearás una excepción no controlada que se registrará en el log de ELMAH.

  1. Presione CTRL+F5 para ejecutar la aplicación de ejemplo Wingtip Toys.

  2. Para escribir una excepción no controlada en el registro ELMAH, vaya en el explorador a la siguiente dirección URL (con el número de puerto):
    https://localhost:44300/NoPage.aspx Se mostrará la página de error.

  3. Para mostrar el registro de ELMAH, vaya en el explorador a la siguiente dirección URL (con el número de puerto):
    https://localhost:44300/elmah.axd

    control de errores de ASP.NET: registro de errores de ELMAH

Resumen

En este tutorial, ha aprendido a controlar errores en el nivel de aplicación, el nivel de página y el nivel de código. También ha aprendido a registrar errores controlados y no controlados para su revisión posterior. Ha agregado la utilidad ELMAH para proporcionar el registro de excepciones y la notificación a la aplicación mediante NuGet. Además, ha aprendido sobre la importancia de los mensajes de error seguros.

Conclusión de la serie de tutoriales

Gracias por seguir. Espero que este conjunto de tutoriales le haya ayudado a familiarizarse más con ASP.NET Web Forms. Si necesita más información sobre las características de Web Forms disponibles en ASP.NET 4.5 y Visual Studio 2013, consulte ASP.NET y Herramientas Web para Visual Studio 2013 Notas de la versión. Además, asegúrese de echar un vistazo al tutorial mencionado en la sección Pasos siguientes y probar de forma definida la evaluación gratuita de Azure.

Gracias - Erik

Pasos siguientes

Para más información sobre cómo implementar la aplicación web en Microsoft Azure, consulte Implementación de una aplicación de formularios web de ASP.NET segura con pertenencia, OAuth y SQL Database en un sitio web de Azure.

Versión de prueba gratuita

Microsoft Azure: evaluación gratuita
La publicación del sitio web en Microsoft Azure le ahorrará tiempo, mantenimiento y gastos. Es un proceso rápido para implementar la aplicación web en Azure. Cuando necesite mantener y supervisar la aplicación web, Azure ofrece una variedad de herramientas y servicios. Administre datos, tráfico, identidad, copias de seguridad, mensajería, medios y rendimiento en Azure. Además, todo esto se proporciona en un enfoque muy rentable.

Recursos adicionales

Registro de detalles de errores con el monitoreo de salud de ASP.NET
ELMAH

Reconocimientos

Me gustaría agradecer a las siguientes personas que realizaron contribuciones significativas al contenido de esta serie de tutoriales:

Contribuciones de la comunidad