Tratamento de erro do ASP.NET

por Erik Reitan

Baixar o Projeto de Exemplo de Brinquedos wingtip (C#) ou baixar e-book (PDF)

Esta série de tutoriais ensinará os conceitos básicos da criação de um aplicativo ASP.NET Web Forms usando ASP.NET 4.5 e Microsoft Visual Studio Express 2013 para Web. Um projeto Visual Studio 2013 com código-fonte C# está disponível para acompanhar esta série de tutoriais.

Neste tutorial, você modificará o aplicativo de exemplo Wingtip Toys para incluir tratamento de erros e registro em log de erros. O tratamento de erros permitirá que o aplicativo lide normalmente com erros e exiba mensagens de erro adequadamente. O log de erros permitirá que você localize e corrija erros ocorridos. Este tutorial se baseia no tutorial anterior "Roteamento de URL" e faz parte da série de tutoriais Wingtip Toys.

O que você aprenderá:

  • Como adicionar o tratamento de erros global à configuração do aplicativo.
  • Como adicionar tratamento de erros nos níveis de aplicativo, página e código.
  • Como registrar erros para revisão posterior.
  • Como exibir mensagens de erro que não comprometem a segurança.
  • Como implementar o log de erros de Módulos e Manipuladores de Log de Erros (ELMAH).

Visão geral

ASP.NET aplicativos devem ser capazes de lidar com erros que ocorrem durante a execução de maneira consistente. ASP.NET usa o CLR (Common Language Runtime), que fornece uma maneira de notificar aplicativos de erros de maneira uniforme. Quando ocorre um erro, uma exceção é gerada. Uma exceção é qualquer erro, condição ou comportamento inesperado que um aplicativo encontra.

No .NET Framework, uma exceção é um objeto herdado da System.Exception classe . Uma exceção é lançada de uma área do código em que ocorreu um problema. A exceção é passada a pilha de chamadas para um local em que o aplicativo fornece código para lidar com a exceção. Se o aplicativo não manipular a exceção, o navegador será forçado a exibir os detalhes do erro.

Como prática recomendada, manipule erros no nível do código em Try//CatchFinally blocos dentro do código. Tente colocar esses blocos para que o usuário possa corrigir problemas no contexto em que eles ocorrem. Se os blocos de tratamento de erros estiverem muito longe de onde o erro ocorreu, será mais difícil fornecer aos usuários as informações necessárias para corrigir o problema.

Classe Exception

A classe Exception é a classe base da qual as exceções herdam. A maioria dos objetos de exceção são instâncias de alguma classe derivada da classe Exception, como a SystemException classe , a IndexOutOfRangeException classe ou a ArgumentNullException classe . A classe Exception tem propriedades, como a StackTrace propriedade, a InnerException propriedade e a Message propriedade , que fornecem informações específicas sobre o erro ocorrido.

Hierarquia de herança de exceção

O runtime tem um conjunto base de exceções derivadas da SystemException classe que o runtime gera quando uma exceção é encontrada. A maioria das classes que herdam da classe Exception, como a IndexOutOfRangeException classe e a ArgumentNullException classe , não implementa membros adicionais. Portanto, as informações mais importantes para uma exceção podem ser encontradas na hierarquia de exceções, no nome da exceção e nas informações contidas na exceção.

Hierarquia de tratamento de exceções

Em um aplicativo ASP.NET Web Forms, as exceções podem ser tratadas com base em uma hierarquia de manipulação específica. Uma exceção pode ser tratada nos seguintes níveis:

  • Nível de aplicativo
  • Nível da página
  • Nível de código

Quando um aplicativo lida com exceções, informações adicionais sobre a exceção herdada da classe Exception geralmente podem ser recuperadas e exibidas para o usuário. Além do nível de aplicativo, página e código, você também pode lidar com exceções no nível do módulo HTTP e usando um manipulador personalizado do IIS.

Tratamento de erros no nível do aplicativo

Você pode lidar com erros padrão no nível do aplicativo modificando a configuração do aplicativo ou adicionando um Application_Error manipulador no arquivo Global.asax do aplicativo.

Você pode lidar com erros padrão e erros HTTP adicionando uma customErrors seção ao arquivo Web.config . A customErrors seção permite que você especifique uma página padrão para a qual os usuários serão redirecionados quando ocorrer um erro. Ele também permite que você especifique páginas individuais para erros de código status 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>

Infelizmente, quando você usa a configuração para redirecionar o usuário para uma página diferente, não tem os detalhes do erro ocorrido.

No entanto, você pode capturar erros que ocorrem em qualquer lugar do aplicativo adicionando código ao Application_Error manipulador no arquivo 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);
    }
}

Tratamento de eventos de erro no nível da página

Um manipulador de nível de página retorna o usuário para a página em que o erro ocorreu, mas como as instâncias de controles não são mantidas, não haverá mais nada na página. Para fornecer os detalhes do erro ao usuário do aplicativo, você deve escrever especificamente os detalhes do erro na página.

Normalmente, você usaria um manipulador de erros no nível da página para registrar erros sem tratamento ou para levar o usuário a uma página que possa exibir informações úteis.

Este exemplo de código mostra um manipulador para o evento Error em uma página da Web ASP.NET. Esse manipulador captura todas as exceções que ainda não são tratadas dentro try/catch de blocos na 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();
}

Depois de manipular um erro, você deve desmarcá-lo chamando o ClearError método do objeto Server (HttpServerUtility classe), caso contrário, verá um erro que ocorreu anteriormente.

Tratamento de erros no nível do código

A instrução try-catch consiste em um bloco try seguido por uma ou mais cláusulas catch, que especificam manipuladores para diferentes exceções. Quando uma exceção é gerada, o CLR (Common Language Runtime) procura a instrução catch que manipula essa exceção. Se o método em execução no momento não contiver um bloco catch, o CLR examinará o método que chamou o método atual e assim por diante, até a pilha de chamadas. Se nenhum bloco catch for encontrado, o CLR exibirá uma mensagem de exceção sem tratamento para o usuário e interromperá a execução do programa.

O exemplo de código a seguir mostra uma maneira comum de usar try//catchfinally para lidar com erros.

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();
    }
}

No código acima, o bloco try contém o código que precisa ser protegido contra uma possível exceção. O bloco é executado até que uma exceção seja lançada ou o bloco seja concluído com êxito. Se ocorrer uma FileNotFoundException exceção ou uma exceção IOException , a execução será transferida para uma página diferente. Em seguida, o código contido no bloco finally é executado, independentemente de um erro ter ocorrido ou não.

Adicionando suporte ao registro em log de erros

Antes de adicionar o tratamento de erros ao aplicativo de exemplo Wingtip Toys, você adicionará suporte ao registro em log de erros adicionando uma ExceptionUtility classe à pasta Lógica . Ao fazer isso, sempre que o aplicativo manipular um erro, os detalhes do erro serão adicionados ao arquivo de log de erros.

  1. Clique com o botão direito do mouse na pasta Lógica e selecione Adicionar ->Novo Item.
    A caixa de diálogo Adicionar novo item é exibida.

  2. Selecione o grupo de modelos Visual C# ->Code à esquerda. Em seguida, selecione Classena lista intermediária e nomeie-a como ExceptionUtility.cs.

  3. Escolha Adicionar. O novo arquivo de classe é exibido.

  4. Substitua o código existente pelo seguinte:

    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();
        }
      }
    }
    

Quando ocorre uma exceção, a exceção pode ser gravada em um arquivo de log de exceção chamando o LogException método . Esse método usa dois parâmetros, o objeto de exceção e uma cadeia de caracteres que contém detalhes sobre a origem da exceção. O log de exceção é gravado no arquivo ErrorLog.txt na pasta App_Data .

Adicionando uma página de erro

No aplicativo de exemplo Wingtip Toys, uma página será usada para exibir erros. A página de erro foi projetada para mostrar uma mensagem de erro segura aos usuários do site. No entanto, se o usuário for um desenvolvedor que está fazendo uma solicitação HTTP que está sendo atendida localmente no computador onde o código reside, detalhes adicionais de erro serão exibidos na página de erro.

  1. Clique com o botão direito do mouse no nome do projeto (Wingtip Toys) em Gerenciador de Soluções e selecione Adicionar ->Novo Item.
    A caixa de diálogo Adicionar novo item é exibida.

  2. Selecione o grupo Modelos do Visual C# ->Web à esquerda. Na lista intermediária, selecione Formulário da Web com Página Mestra e nomeie-o ErrorPage.aspx.

  3. Clique em Adicionar.

  4. Selecione o arquivo Site.Master como a página master e escolha OK.

  5. Substitua a marcação existente pelo seguinte:

    <%@ 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. Substitua o código existente do code-behind (ErrorPage.aspx.cs) para que ele apareça da seguinte maneira:

    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();
        }
      }
    }
    

Quando a página de erro é exibida, o Page_Load manipulador de eventos é executado. Page_Load No manipulador, o local em que o erro foi tratado pela primeira vez é determinado. Em seguida, o último erro que ocorreu é determinado por chamar o GetLastError método do objeto Server. Se a exceção não existir mais, uma exceção genérica será criada. Em seguida, se a solicitação HTTP tiver sido feita localmente, todos os detalhes do erro serão mostrados. Nesse caso, somente o computador local que executa o aplicativo Web verá esses detalhes de erro. Depois que as informações de erro forem exibidas, o erro será adicionado ao arquivo de log e o erro será limpo do servidor.

Exibindo mensagens de erro sem tratamento para o aplicativo

Ao adicionar uma customErrors seção ao arquivo Web.config , você pode lidar rapidamente com erros simples que ocorrem em todo o aplicativo. Você também pode especificar como lidar com erros com base em seu valor de código status, como 404 – Arquivo não encontrado.

Atualizar a configuração

Atualize a configuração adicionando uma customErrors seção ao arquivo Web.config .

  1. Em Gerenciador de Soluções, localize e abra o arquivo Web.config na raiz do aplicativo de exemplo Wingtip Toys.

  2. Adicione a customErrors seção ao arquivo Web.config dentro do nó da <system.web> seguinte maneira:

    <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. Salvar o arquivo Web.config.

A customErrors seção especifica o modo , que é definido como "Ativado". Ele também especifica o defaultRedirect, que informa ao aplicativo para qual página navegar quando ocorrer um erro. Além disso, você adicionou um elemento de erro específico que especifica como lidar com um erro 404 quando uma página não é encontrada. Posteriormente neste tutorial, você adicionará tratamento de erro adicional que capturará os detalhes de um erro no nível do aplicativo.

Executando o aplicativo

Agora você pode executar o aplicativo para ver as rotas atualizadas.

  1. Pressione F5 para executar o aplicativo de exemplo Wingtip Toys.
    O navegador é aberto e mostra a página Default.aspx .

  2. Insira a SEGUINTE URL no navegador (certifique-se de usar o número da porta):
    https://localhost:44300/NoPage.aspx

  3. Examine o ErrorPage.aspx exibido no navegador.

    tratamento de erros ASP.NET – erro de página não encontrado

Quando você solicitar a página NoPage.aspx , que não existe, a página de erro mostrará a mensagem de erro simples e as informações de erro detalhadas se houver detalhes adicionais disponíveis. No entanto, se o usuário solicitasse uma página inexistente de um local remoto, a página de erro mostraria apenas a mensagem de erro em vermelho.

Incluindo uma exceção para fins de teste

Para verificar como seu aplicativo funcionará quando ocorrer um erro, você pode criar deliberadamente condições de erro em ASP.NET. No aplicativo de exemplo Wingtip Toys, você lançará uma exceção de teste quando a página padrão for carregada para ver o que acontece.

  1. Abra o code-behind da página Default.aspx no Visual Studio.
    A página code-behind Default.aspx.cs será exibida.

  2. Page_Load No manipulador, adicione código para que o manipulador apareça da seguinte maneira:

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

É possível criar vários tipos diferentes de exceções. No código acima, você está criando um InvalidOperationException quando a página Default.aspx é carregada.

Executando o aplicativo

Você pode executar o aplicativo para ver como o aplicativo lida com a exceção.

  1. Pressione CTRL+F5 para executar o aplicativo de exemplo Wingtip Toys.
    O aplicativo lança InvalidOperationException.

    Nota

    Você deve pressionar CTRL+F5 para exibir a página sem invadir o código para exibir a origem do erro no Visual Studio.

  2. Examine o ErrorPage.aspx exibido no navegador.

    tratamento de erros ASP.NET – página de erro

Como você pode ver nos detalhes do erro, a exceção foi interceptada pela customError seção no arquivo Web.config .

Adicionando Application-Level tratamento de erros

Em vez de interceptar a exceção usando a customErrors seção no arquivo Web.config , em que você obtém poucas informações sobre a exceção, pode interceptar o erro no nível do aplicativo e recuperar detalhes do erro.

  1. Em Gerenciador de Soluções, localize e abra o arquivo Global.asax.cs.

  2. Adicione um manipulador de Application_Error para que ele apareça da seguinte maneira:

    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);
        }
      }
    }
    

Quando ocorre um erro no aplicativo, o Application_Error manipulador é chamado. Nesse manipulador, a última exceção é recuperada e revisada. Se a exceção foi sem tratamento e a exceção contém detalhes de exceção interna (ou seja, InnerException não é nula), o aplicativo transfere a execução para a página de erro em que os detalhes da exceção são exibidos.

Executando o aplicativo

Você pode executar o aplicativo para ver os detalhes de erro adicionais fornecidos manipulando a exceção no nível do aplicativo.

  1. Pressione CTRL+F5 para executar o aplicativo de exemplo Wingtip Toys.
    O aplicativo lança o InvalidOperationException .

  2. Examine o ErrorPage.aspx exibido no navegador.

    tratamento de erros ASP.NET – Erro no nível do aplicativo

Adicionando Page-Level tratamento de erros

Você pode adicionar o tratamento de erros no nível da página a uma página usando a @Page adição de um ErrorPage atributo à diretiva da página ou adicionando um Page_Error manipulador de eventos ao code-behind de uma página. Nesta seção, você adicionará um Page_Error manipulador de eventos que transferirá a execução para a página ErrorPage.aspx .

  1. Em Gerenciador de Soluções, localize e abra o arquivo Default.aspx.cs.

  2. Adicione um Page_Error manipulador para que o code-behind apareça da seguinte maneira:

    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);
          }
        }
      }
    }
    

Quando ocorre um erro na página, o Page_Error manipulador de eventos é chamado. Nesse manipulador, a última exceção é recuperada e revisada. Se ocorrer um InvalidOperationException , o Page_Error manipulador de eventos transferirá a execução para a página de erro em que os detalhes da exceção são exibidos.

Executando o aplicativo

Agora você pode executar o aplicativo para ver as rotas atualizadas.

  1. Pressione CTRL+F5 para executar o aplicativo de exemplo Wingtip Toys.
    O aplicativo lança o InvalidOperationException .

  2. Examine o ErrorPage.aspx exibido no navegador.

    tratamento de erros ASP.NET – erro no nível da página

  3. Feche a janela do navegador.

Removendo a exceção usada para teste

Para permitir que o aplicativo de exemplo Wingtip Toys funcione sem gerar a exceção que você adicionou anteriormente neste tutorial, remova a exceção.

  1. Abra o code-behind da página Default.aspx .

  2. Page_Load No manipulador, remova o código que gera a exceção para que o manipulador apareça da seguinte maneira:

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

Adicionando Code-Level log de erros

Conforme mencionado anteriormente neste tutorial, você pode adicionar instruções try/catch para tentar executar uma seção de código e lidar com o primeiro erro que ocorre. Neste exemplo, você só gravará os detalhes do erro no arquivo de log de erros para que o erro possa ser revisado posteriormente.

  1. Em Gerenciador de Soluções, na pasta Lógica, localize e abra o arquivo PayPalFunctions.cs.

  2. Atualize o HttpCall método para que o código apareça da seguinte maneira:

    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;
    }
    

O código acima chama o LogException método contido na ExceptionUtility classe . Você adicionou o arquivo de classe ExceptionUtility.cs à pasta Lógica anteriormente neste tutorial. O método LogException utiliza dois parâmetros. O primeiro parâmetro é o objeto de exceção. O segundo parâmetro é uma cadeia de caracteres usada para reconhecer a origem do erro.

Inspecionando as informações de log de erros

Conforme mencionado anteriormente, você pode usar o log de erros para determinar quais erros em seu aplicativo devem ser corrigidos primeiro. É claro que somente os erros que foram interceptados e gravados no log de erros serão registrados.

  1. Em Gerenciador de Soluções, localize e abra o arquivo ErrorLog.txt na pasta App_Data.
    Talvez seja necessário selecionar a opção "Mostrar Todos os Arquivos" ou a opção "Atualizar" na parte superior do Gerenciador de Soluções para ver o arquivo ErrorLog.txt.

  2. Examine o log de erros exibido no Visual Studio:

    Tratamento de erros ASP.NET – ErrorLog.txt

Mensagens de erro seguras

É importante observar que, quando seu aplicativo exibe mensagens de erro, ele não deve fornecer informações que um usuário mal-intencionado pode achar úteis para atacar seu aplicativo. Por exemplo, se o aplicativo tentar gravar sem sucesso em um banco de dados, ele não deverá exibir uma mensagem de erro que inclua o nome de usuário que está usando. Por esse motivo, uma mensagem de erro genérica em vermelho é exibida para o usuário. Todos os detalhes de erro adicionais são exibidos apenas para o desenvolvedor no computador local.

Usando ELMAH

ELMAH (Módulos e Manipuladores de Log de Erros) é um recurso de registro em log de erros que você conecta ao aplicativo ASP.NET como um pacote NuGet. O ELMAH fornece os seguintes recursos:

  • Registro em log de exceções sem tratamento.
  • Uma página da Web para exibir todo o log de exceções sem tratamento recodificadas.
  • Uma página da Web para exibir os detalhes completos de cada exceção registrada.
  • Uma notificação por email de cada erro no momento em que ele ocorre.
  • Um RSS feed dos últimos 15 erros do log.

Antes de trabalhar com o ELMAH, você deve instalá-lo. Isso é fácil usando o instalador de pacote NuGet . Conforme mencionado anteriormente nesta série de tutoriais, o NuGet é uma extensão do Visual Studio que facilita a instalação e a atualização código aberto bibliotecas e ferramentas no Visual Studio.

  1. No Visual Studio, no menu Ferramentas, selecione Gerenciador de Pacotes> NuGetGerenciar Pacotes NuGet para solução.

    tratamento de erros ASP.NET – Gerenciar pacotes NuGet para solução

  2. A caixa de diálogo Gerenciar Pacotes NuGet é exibida no Visual Studio.

  3. Na caixa de diálogo Gerenciar Pacotes NuGet , expanda Online à esquerda e selecione nuget.org. Em seguida, localize e instale o pacote ELMAH na lista de pacotes disponíveis online.

    Tratamento de erros ASP.NET – Pacote NuGet ELMA

  4. Você precisará ter uma conexão com a Internet para baixar o pacote.

  5. Na caixa de diálogo Selecionar Projetos , verifique se a seleção WingtipToys está selecionada e clique em OK.

    tratamento de erros ASP.NET – caixa de diálogo Selecionar Projetos

  6. Clique em Fechar na caixa de diálogo Gerenciar Pacotes NuGet , se necessário.

  7. Se o Visual Studio solicitar que você recarregue arquivos abertos, selecione "Sim para Todos".

  8. O pacote ELMAH adiciona entradas para si mesmo no arquivo Web.config na raiz do projeto. Se o Visual Studio perguntar se você deseja recarregar o arquivo deWeb.config modificado, clique em Sim.

O ELMAH agora está pronto para armazenar quaisquer erros sem tratamento que ocorram.

Exibindo o log ELMAH

Exibir o log ELMAH é fácil, mas primeiro você criará uma exceção sem tratamento que será registrada no log ELMAH.

  1. Pressione CTRL+F5 para executar o aplicativo de exemplo Wingtip Toys.

  2. Para gravar uma exceção sem tratamento no log ELMAH, navegue no navegador até a seguinte URL (usando o número da porta):
    https://localhost:44300/NoPage.aspx A página de erro será exibida.

  3. Para exibir o log ELMAH, navegue no navegador até a seguinte URL (usando o número da porta):
    https://localhost:44300/elmah.axd

    Tratamento de erros ASP.NET – Log de Erros ELMAH

Resumo

Neste tutorial, você aprendeu a lidar com erros no nível do aplicativo, no nível da página e no nível do código. Você também aprendeu a registrar em log erros manipulados e sem tratamento para revisão posterior. Você adicionou o utilitário ELMAH para fornecer registro em log de exceção e notificação ao seu aplicativo usando o NuGet. Além disso, você aprendeu sobre a importância das mensagens de erro seguras.

Conclusão da série de tutoriais

Obrigado por acompanhar. Espero que esse conjunto de tutoriais tenha ajudado você a se familiarizar mais com ASP.NET Web Forms. Se você precisar de mais informações sobre Web Forms recursos disponíveis no ASP.NET 4.5 e Visual Studio 2013, consulte ASP.NET and Web Tools para Visual Studio 2013 notas sobre a versão. Além disso, confira o tutorial mencionado na seção Próximas Etapas e experimente a avaliação gratuita do Azure.

Obrigado - Erik

Próximas etapas

Saiba mais sobre como implantar seu aplicativo Web no Microsoft Azure, confira Implantar um aplicativo de ASP.NET Web Forms seguro com associação, OAuth e Banco de Dados SQL em um site do Azure.

Avaliação gratuita

Microsoft Azure – Avaliação gratuita
Publicar seu site no Microsoft Azure economizará tempo, manutenção e despesas. É um processo rápido para implantar seu aplicativo Web no Azure. Quando você precisa manter e monitorar seu aplicativo Web, o Azure oferece uma variedade de ferramentas e serviços. Gerenciar dados, tráfego, identidade, backups, mensagens, mídia e desempenho no Azure. E tudo isso é fornecido em uma abordagem muito econômica.

Recursos adicionais

Detalhes do erro de registro em log com ASP.NET monitoramento de integridade
ELMAH

Confirmações

Gostaria de agradecer às seguintes pessoas que fizeram contribuições significativas ao conteúdo desta série de tutoriais:

Contribuições da Comunidade