Control de errores de ASP.NET

Por Erik Reitan

Descargar del proyecto de ejemplo (C#) Wingtip Toys o Descarga del libro electrónico (PDF)

En esta serie de tutoriales se le enseñarán los conceptos básicos de la creación de una aplicación ASP.NET Web Forms mediante ASP.NET 4.5 y Microsoft Visual Studio Express 2013 para Web. Como acompañamiento a este serie de tutoriales, hay disponible un proyecto con código fuente de C# de Visual Studio 2013.

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 correspondientes. El registro de errores le permitirá buscar y corregir los 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 de Wingtip Toys.

Temas que se abordarán:

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

Información general

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

En .NET Framework, una excepción es un objeto que hereda de la clase System.Exception. Una excepción se inicia desde un área del código en la que ha producido un problema. La excepción se pasa por la pila de llamadas a un lugar donde la aplicación proporciona código para controlarla. Si la aplicación no controla la excepción, el explorador se ve obligado a mostrar los detalles del error.

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

Clase de excepción

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 las clases SystemException, IndexOutOfRangeException o ArgumentNullException. La clase Exception tiene propiedades, como StackTrace, InnerException y Message, 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 clase SystemException que el tiempo de ejecución inicia cuando se encuentra una excepción. La mayoría de las clases que heredan de la clase Exception, como IndexOutOfRangeException y ArgumentNullException, no implementan miembros adicionales. Por tanto, la información más importante para una excepción se puede encontrar en la jerarquía de clases de excepción, 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 ASP.NET Web Forms, las excepciones se pueden controlar en función de una jerarquía de control específica. Una excepción se puede controlar en los siguientes niveles:

  • Nivel de aplicación
  • 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 a menudo se puede recuperar y mostrar al usuario. Además del nivel de aplicación, página y 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 si modifica la configuración de la aplicación o agrega un controlador Application_Error en el archivo Global.asax de la aplicación.

Puede controlar los errores predeterminados y los errores HTTP si agrega una sección customErrors al archivo Web.config. La sección customErrors le permite especificar una página predeterminada a la que se redirigirán los usuarios cuando se produzca un error. También le 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 otra página, no tiene los detalles del error que se ha producido.

Pero puede interceptar errores que se producen en cualquier parte de la aplicación si agrega código al controlador Application_Error 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);
    }
}

Control de eventos de error de nivel de página

Un controlador de nivel de página devuelve al usuario a la página donde se ha producido el error, pero como 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 en la que se 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 todavía no se han controlado 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, para borrarlo debe llamar al método ClearError del objeto Server (la clase HttpServerUtility); de lo contrario verá un error que se ha producido anteriormente.

Control de errores de nivel de código

La instrucción try-catch consta de un bloque try seguido de una o más cláusulas catch que especifican controladores para diferentes excepciones. Cuando se inicia una excepción, Common Language Runtime (CLR) busca la instrucción catch que controla esta excepción. Si el método que se ejecuta actualmente no contiene un bloque catch, CLR busca el método que ha llamado al método actual, y así sucesivamente por la pila de llamadas. Si no se encuentra ningún bloque catch, CLR muestra al usuario un mensaje de excepción no controlada 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 inicia una excepción o hasta que se completa correctamente. Si se inicia una excepción FileNotFoundException o IOException, la ejecución se transfiere a otra página. Después, se ejecuta el código incluido en el bloque finally, independientemente de si se ha producido o no un error.

Adición de compatibilidad con el registro de errores

Antes de agregar el control de errores a la aplicación de ejemplo Wingtip Toys, agregará compatibilidad con el registro de errores mediante 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, luego, seleccione Agregar ->Nuevo elemento.
    Se abrirá el cuadro de diálogo Agregar nuevo elemento.

  2. Seleccione el grupo de plantillas Visual C# ->Código de la izquierda. Después, seleccione Claseen la lista central y asígnele el nombre ExceptionUtility.cs.

  3. Haga clic en 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 si se llama al método LogException. 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 de la carpeta App_Data.

Adición de 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. Pero 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 abrirá el cuadro de diálogo Agregar nuevo elemento.

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

  3. Haga clic en Agregar.

  4. Seleccione el archivo Site.Master como página maestra y, después, elija Aceptar.

  5. Reemplace el marcado existente por el 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 sea similar al siguiente:

    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 controlador de eventos Page_Load. En el controlador Page_Load, se determina la ubicación de donde se ha controlado el error por primera vez. Después, se determina el último error que se ha producido mediante una llamada al método GetLastError del objeto Server. Si la excepción ya no existe, se crea una excepción genérica. Después, si la solicitud HTTP se ha realizado 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 que se muestra la información de error, el error se agrega al archivo de registro y se borra del servidor.

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

Al agregar una sección customErrors al archivo Web.config, puede controlar rápidamente 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.

Actualización de la configuración

Para actualizar la configuración, agregue una sección customErrors 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 sección customErrors 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 sección customErrors especifica el modo, que se establece en "Activado". También especifica 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 indica 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 su número de puerto):
    https://localhost:44300/NoPage.aspx

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

    ASP.NET Error Handling - Page Not Found Error

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

Inclusión de 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, iniciará una excepción de prueba cuando se cargue la página predeterminada para ver lo que sucede.

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

  2. En el controlador Page_Load, agregue código para que sea similar al siguiente:

    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 de excepciones diferentes. En el código anterior, va a crear una instancia InvalidOperationException cuando se cargue la página Default.aspx.

Ejecutar la aplicación

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

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

    Nota:

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

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

    ASP.NET Error Handling - Error Page

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

Adición de control de errores de nivel de aplicación

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

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

  2. Agregue un controlador Application_Error que sea similar al siguiente:

    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 controlador Application_Error. En este controlador, se recupera y revisa la última excepción. Si la excepción no se ha controlado y contiene detalles de excepción internos (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 inicia InvalidOperationException.

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

    ASP.NET Error Handling - Application Level Error

Adición de control de errores de 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 atributo ErrorPage a la directiva @Page de la página, o bien un controlador de eventos Page_Error al código subyacente de una página. En esta sección, agregará un controlador de eventos Page_Error 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 controlador Page_Error para que el código subyacente sea similar al siguiente:

    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 controlador de eventos Page_Error. En este controlador, se recupera y revisa la última excepción. Si se produce 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 inicia InvalidOperationException.

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

    ASP.NET Error Handling - Page Level Error

  3. Cierre la ventana del explorador.

Eliminación de la excepción usada para las pruebas

Para permitir que la aplicación de ejemplo Wingtip Toys funcione sin iniciar la excepción que ha agregado antes en este tutorial, quite la excepción.

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

  2. En el controlador Page_Load, quite el código que inicia la excepción para que sea similar al siguiente:

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

Adición del registro de errores de nivel de código

Como se ha mencionado antes en este tutorial, puede agregar instrucciones try/catch para intentar ejecutar una sección de código y controlar el primer error que se produzca. 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 sea similar al siguiente:

    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 método LogException contenido en la clase ExceptionUtility. Anteriormente en este tutorial ha agregado el archivo de clase ExceptionUtility.cs a la carpeta Logic. El método LogException 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 del registro de errores

Como se ha mencionado antes, 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 han capturado y escrito 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 de lExplorador de soluciones para ver el archivo ErrorLog.txt.

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

    ASP.NET Error Handling - ErrorLog.txt

Mensajes de error seguros

Es importante tener en cuenta que cuando la aplicación muestra mensajes de error, no debe proporcionar información que un usuario malintencionado podría aprovechar para atacar la aplicación. Por ejemplo, si la aplicación intenta escribir incorrectamente en una base de datos, no debe mostrar un mensaje de error que incluya el nombre de usuario que utiliza. Por este motivo, se muestra un mensaje de error genérico en color 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 utilidad de registro de errores que se conecta a la aplicación de ASP.NET como un paquete NuGet. ELMAH proporciona las funciones siguientes:

  • Registro de excepciones no controladas.
  • Una página web para ver todo el registro de excepciones no controladas recodificadas.
  • Una 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.
  • Una fuente RSS de los últimos 15 errores del registro.

Para poder trabajar con el ELMAH, debe instalarlo. Esto es fácil mediante el instalador de paquetes NuGet. Como se ha mencionado antes 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. Desde Visual Studio, en el menú Herramientas, seleccione Administrador de paquetes NuGet>Administrar paquetes NuGet para la solución.

    ASP.NET Error Handling - Manage NuGet Packages for Solution

  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, después, seleccione nuget.org. Luego, busque e instale el paquete ELMAH en la lista de paquetes disponibles en línea.

    ASP.NET Error Handling - ELMA NuGet Package

  4. Necesitará una conexión a Internet para descargar el paquete.

  5. En el cuadro de diálogo Seleccionar proyectos, asegúrese de que la opción WingtipToys está seleccionada y, después, haga clic en Aceptar.

    ASP.NET Error Handling - Select Projects Dialog

  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í mismo en el archivo Web.config en la raíz del proyecto. Si Visual Studio le pregunta si quiere volver a cargar el archivo Web.config modificado, haga clic en .

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

Visualización del registro de ELMAH

Ver el registro de ELMAH es fácil, pero primero creará una excepción no controlada que se registrará en el registro 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 de 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

    ASP.NET Error Handling - ELMAH Error Log

Resumen

En este tutorial, ha aprendido a controlar errores en el nivel de aplicación,de página y 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 registro de excepciones y notificación a la aplicación mediante NuGet. Además, ha obtenido información 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, veaNotas de la versión de ASP.NET y Web Tools para Visual Studio 2013. Además, asegúrese de examinar el tutorial mencionado en la sección Pasos siguientes y probar la evaluación gratuita de Azure.

Thanks - Erik

Pasos siguientes

Para más información sobre la implementación de la aplicación web en Microsoft Azure, vea Implementación de una aplicación segura de ASP.NET Web Forms con pertenencia, OAuth y SQL Database en un sitio web de Azure.

Evaluación gratuita

Microsoft Azure: Prueba gratuita
La publicación del sitio web en Microsoft Azure le ahorrará tiempo, mantenimiento y gastos. La implementación de la aplicación web en Azure es un proceso rápido. 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 error con seguimiento de estado de ASP.NET
ELMAH

Agradecimientos

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

Contribuciones de la comunidad