Criar páginas personalizadas de relatório de erros no ASP.NET usando o .NET do Visual Basic

Este artigo descreve como usar o código .NET do Microsoft Visual Basic para capturar e responder a erros quando eles ocorrem em ASP.NET.

Versão original do produto: Visual Basic .NET, ASP.NET
Número de KB original: 308132

Resumo

ASP.NET aprimorou as opções de tratamento de erros das Páginas tradicionais do Active Server (ASP). Em ASP.NET, você pode lidar com erros em vários níveis diferentes em seus aplicativos.

Novos recursos no ASP.NET

ASP.NET oferece vários avanços em como você pode lidar e responder a erros. No ASP tradicional, você lida com erros com On Error Resume Next (ou try-catch blocos no JScript). Alternativamente, se você estiver executando o IIS (Internet Information Services), você usará o ASPError objeto para criar uma página de relatório de erros personalizada. No entanto, essas abordagens têm suas limitações.

ASP.NET fornece vários níveis nos quais você pode lidar e responder a erros que podem ocorrer quando você executa um aplicativo ASP.NET. ASP.NET fornece três métodos main que permitem capturar e responder a erros quando eles ocorrem: o Page_Error evento, o Application_Error evento e o arquivo de configuração do aplicativo (Web.config).

Este artigo demonstra como usar esses novos recursos em seu aplicativo ASP.NET. Embora este artigo descreva como fornecer páginas de erro personalizadas e relatórios gerais de erros, pois se relaciona diretamente com ASP.NET, este artigo não descreve outras abordagens de tratamento de erros, como o try-catch-finally bloco e o sistema de exceção CLR (Common Language Runtime).

Usar o evento Page_Error

O Page_Error evento fornece uma maneira de capturar erros que ocorrem no nível da página. Você pode exibir informações de erro (como o código de exemplo a seguir faz), ou você pode registrar o evento ou executar alguma outra ação.

Observação

Este exemplo exibe informações detalhadas de erro no navegador apenas para fins de demonstração. Você deseja ter cuidado ao exibir informações detalhadas para o usuário final do aplicativo, especialmente quando o aplicativo estiver em execução na Internet. Uma ação mais apropriada seria exibir uma mensagem para o usuário notificando-os de que ocorreu um erro e, na verdade, registrar os detalhes de erro específicos no log de eventos.

Este exemplo gera uma exceção nula, o que força um erro a ocorrer no Page_Load evento. Siga estas etapas para criar a página inicial que testará o Page_Error evento.

  1. Siga estas etapas para adicionar um novo arquivo chamado PageEvent.aspx ao seu projeto:

    1. Abra o Visual Studio .NET.
    2. Em Gerenciador de Soluções, clique com o botão direito do mouse no nó do projeto, aponte para Adicionar e clique em Adicionar Formulário Web.
    3. Na caixa de texto Nome , digite PageEvent.aspx e clique em Abrir.
  2. Adicione o seguinte código a PageEvent.aspx:

    <%@ Page Language="vb"%>
    <script runat=server>
        Sub Page_Load(Sender as object, e as EventArgs)
           throw(new System.ArgumentNullException())
        End Sub
        Sub Page_Error(Sender as object, e as EventArgs)
           Dim objErr as Exception = Server.GetLastError().GetBaseException()
           Dim err as String = "<b>Error Caught in Page_Error event</b><hr><br>" & _
                               "<br><b>Error in: </b>" & Request.Url.ToString() & _
                               "<br><b>Error Message: </b>" & objErr.Message.ToString() & _
                               "<br><b>Stack Trace:</b><br>" & _objErr.StackTrace.ToString()
           Response.Write(err.ToString())
           Server.ClearError()
        End Sub
    </script>
    
  3. No menu Arquivo , clique em SalvarPageEvent.aspx.

  4. Clique com o botão direito do mouse na página e clique em Exibir no Navegador para executar a página. Observe que o erro é gerado e relatado de acordo com as especificações de código.

Observação

Você pode notar que o código emite uma chamada para Server.ClearError. Isso impede que o erro continue no evento a Application_Error ser tratado.

Usar o evento Application_Error

Semelhante ao Page_Error evento, você pode usar o Application_Error evento para capturar erros que ocorrem em seu aplicativo. Devido ao escopo do evento em todo o aplicativo, você pode registrar informações de erro do aplicativo ou manipular outros erros no nível do aplicativo que podem ocorrer.

O exemplo a seguir é baseado no exemplo de Page_Error código de evento anterior e seria disparado se o Page_Load erro no evento não estivesse preso no Page_Error evento. O Application_Error evento é especificado no arquivo Global.asax do seu aplicativo. Para simplificar, as etapas nesta seção criam uma nova página na qual, para gerar a exceção, aprisione o erro no Application_Error caso do arquivo Global.asax e escreva o erro no log de eventos. As seguintes etapas demonstram como usar o Application_Error evento:

  1. Adicione um novo arquivo chamado AppEvent.aspx ao seu projeto.

  2. Adicione o seguinte código ao AppEvent.aspx:

    <script language=vb runat="server">
         Sub Page_Load(Sender as object, e as EventArgs)
             throw(new ArgumentNullException())
         End Sub
    </script>
    
  3. No menu Arquivo , clique em SalvarAppEvent.aspx.

  4. Adicione o Application_Error evento ao arquivo Global.asax para capturar o erro que você lança no Page_Load caso da página AppEvent.aspx . Observe que você deve adicionar uma instrução Imports para o System.Diagnostics namespace ao Global.asax para usar o log de eventos.

    Adicione o seguinte código ao arquivo Global.asax :

    Imports System.Diagnostics
    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        Dim objErr As Exception = Server.GetLastError().GetBaseException()
        Dim err As String = "Error Caught in Application_Error event" & _
                                System.Environment.NewLine & _
                                "Error in: " & Request.Url.ToString() & _
                                System.Environment.NewLine & _
                                "Error Message: " & objErr.Message.ToString() & _
                                System.Environment.NewLine & _
                                "Stack Trace:" & objErr.StackTrace.ToString()
        EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error)
        Server.ClearError()
        additional actions...
    End Sub
    
  5. Salve o arquivo Global.asax .

  6. No Visual Studio .NET, no menu Compilar , clique em Compilar.

  7. Clique com o botão direito do mouse na página e clique em Exibir no Navegador. Nesse caso, a página ficará em branco, no entanto, você deve observar que uma nova entrada foi adicionada no log de eventos. Este exemplo torna uma entrada no log de aplicativos, que é acessível a partir do Visualizador de Eventos. Depois de registrar o erro, talvez você queira redirecionar o usuário para outra página de erro mais amigável ao usuário ou executar algumas ações adicionais, se necessário.

Usar o arquivo Web.config

Se você não chamar Server.ClearError ou prender o erro no Page_Error evento ou Application_Error , o erro será tratado com base nas configurações na <customErrors> seção do arquivo Web.config . <customErrors> Na seção, você pode especificar uma página de redirecionamento como uma página de erro padrão (defaultRedirect) ou especificar para uma página específica com base no código de erro HTTP (Protocolo de Transferência de Hipertexto) que é gerado. Você pode usar esse método para personalizar a mensagem de erro que o usuário recebe.

Se ocorrer um erro que não esteja preso em nenhum dos níveis anteriores em seu aplicativo, essa página personalizada será exibida. Esta seção demonstra como modificar o arquivo Global.asax para que isso Server.ClearError nunca seja chamado. Como resultado, o erro é tratado no arquivo Web.config como o último ponto para capturar o erro.

  1. Abra o arquivo Global.asax do exemplo anterior.

  2. Comente a Server.ClearError linha para garantir que o erro seja exibido no arquivo Web.config .

  3. Salve suas alterações no Global.asax. Seu código agora deve aparecer semelhante ao seguinte:

     Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
         Dim objErr As Exception = Server.GetLastError().GetBaseException()
         Dim err As String = "Error Caught in Application_Error event" & _
                             System.Environment.NewLine & _
                             "Error in: " & Request.Url.ToString() & _
                             System.Environment.NewLine & _
                             "Error Message: " & objErr.Message.ToString() & _
                             System.Environment.NewLine & _
                             "Stack Trace:" & objErr.StackTrace.ToString()
         EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error)
         Server.ClearError()
         additional actions...
     End Sub
    
  4. Adicione o seguinte código à <customErrors> seção para redirecionar o usuário para uma página personalizada:

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
    </customErrors>
    

    Observação

    Você deve modificar o caminho do arquivo no defaultRedirect atributo para que ele faça referência aos nomes relevantes do servidor Web e do aplicativo.

  5. Como os erros que estão presos nesse nível são enviados para uma página de erro padrão, você deve criar uma página de erro chamada ErrorStatus.htm. Tenha em mente que você está usando esse método para controlar o que é apresentado ao usuário, portanto, este exemplo usa uma página .htm para a página de erro. Adicione o seguinte código ao ErrorStatus.htm:

    <HTML>
        <HEAD>
            <TITLE></TITLE>
            <META NAME="GENERATOR" Content="Microsoft Visual Studio 7.0">
        </HEAD>
        <BODY>
             <b>Custom Error page!</b>
             <br>
             You have been redirected here from the <customErrors> section of the
             Web.config file.
        </BODY>
    </HTML>
    
  6. Para testar o código, salve os arquivos, crie o projeto e exiba AppEvent.aspx no navegador. Observe que, quando o erro é gerado, você é redirecionado para a página ErrorStatus.htm . Embora você possa referenciar uma página de erro padrão no valor do defaultRedirect atributo na <customErrors> seção, você também pode especificar uma página específica para redirecionar com base no código de erro HTTP que é gerado. O <error> elemento filho permite essa opção. Por exemplo:

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
        <error statusCode="404" redirect="filenotfound.htm"/>
    </customErrors>
    

Observação

A página especificada na defaultRedirect<customErrors> seção é um arquivo .htm . Se você pretende usar GetLastError em uma página .aspx (que os Page_Error exemplos e Application_Error fazem), deverá armazenar a exceção em uma variável de sessão ou em alguma outra abordagem antes que o redirecionamento ocorra.

Observe que a <customErrors> seção inclui um mode atributo definido como On . O mode atributo é usado para controlar como o redirecionamento de erro ocorre. Por exemplo, se você estiver desenvolvendo o aplicativo, provavelmente deseja ver as mensagens de erro ASP.NET reais e não deseja ser redirecionado para a página de erro mais amigável ao usuário. O mode atributo inclui as seguintes configurações:

  • On: exceções não tratadas redirecionam o usuário para a página especificada defaultRedirect . Isso mode é usado principalmente na produção.

  • Off: os usuários recebem as informações de exceção e não são redirecionados para a defaultRedirect página. Isso mode é usado principalmente no desenvolvimento.

  • RemoteOnly: somente os usuários que acessam o site no computador local (usando localhost) recebem as informações de exceção. Todos os outros usuários são redirecionados para a defaultRedirect página. Esse modo é usado principalmente para depuração.

Solução de problemas

Em sua instalação padrão no Windows, ASP.NET executa o código do aplicativo Web em um processo de trabalho. A identidade desse processo é padrão para uma conta local desprivilegiada chamada conta ASPNET . Em versões beta de ASP.NET, a identidade do processo era System, uma conta administrativa poderosa com muitos privilégios no computador.

Em sua instalação padrão no Windows Server (IIS), ASP.NET executa o código do aplicativo Web em um processo de trabalho. A identidade desse processo é padrão para uma conta limitada chamada NetworkService.

Para obter mais informações sobre essa alteração e como ela pode afetar a execução do código neste artigo, bem como outros códigos que possam precisar de direitos de acesso adicionais, consulte padrões & práticas

Referências