Compartilhar via


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

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

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

Resumo

ASP.NET melhorou as opções de tratamento de erros do Active Server Pages (ASP) tradicional. No 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 na forma 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). Como alternativa, se você estiver executando o IIS (Serviços de Informações da Internet), use 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 manipular e responder a erros que podem ocorrer quando você executa um aplicativo ASP.NET. ASP.NET fornece três métodos principais que permitem interceptar 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 relacionados diretamente ao 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 interceptar erros que ocorrem no nível da página. Você pode exibir informações de erro (como o código de exemplo a seguir) ou 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ê deve ser cauteloso ao exibir informações detalhadas para o usuário final do aplicativo, especialmente quando o aplicativo estiver sendo executado na Internet. Uma ação mais apropriada seria exibir uma mensagem para o usuário notificando-o de que ocorreu um erro e, em seguida, registrando os detalhes específicos do erro no log de eventos.

Este exemplo gera uma exceção nula, o que força a ocorrência de um erro 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. No 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 Salvar PageEvent.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 é lançado e relatado de acordo com as especificações do código.

Observação

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

Usar o evento Application_Error

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

O exemplo a seguir é baseado no exemplo de código de evento anterior Page_Error e seria disparado se o Page_Load erro no evento não fosse capturado no Page_Error evento. O Application_Error evento é especificado no arquivo Global.asax do seu aplicativo. Para simplificar, as etapas desta seção criam uma nova página na qual lançar a exceção, interceptar o erro no Application_Error caso do arquivo Global.asax e gravar o erro no log de eventos. As etapas a seguir demonstram como usar o Application_Error evento:

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

  2. Adicione o seguinte código a 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 Salvar AppEvent.aspx.

  4. Adicione o Application_Error evento ao arquivo Global.asax para interceptar o erro que você lança no Page_Load evento da página AppEvent.aspx . Observe que você deve adicionar uma Imports instrução para o System.Diagnostics namespace a 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 ao log de eventos. Este exemplo faz uma entrada no log do aplicativo, que pode ser acessado no Visualizador de Eventos. Depois de registrar o erro, talvez você queira redirecionar o usuário para outra página de erro mais amigável ou executar algumas ações adicionais, se necessário.

Usar o arquivo Web.config

Se você não chamar Server.ClearError ou interceptar o erro no Page_Error evento or 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 uma página específica com base no código de erro HTTP (Hypertext Transfer Protocol) 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 ele Server.ClearError nunca seja chamado. Como resultado, o erro é tratado no arquivo Web.config como o último ponto para interceptar o erro.

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

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

  3. Salve suas alterações em Global.asax. Seu código agora deve ser 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 capturados 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. Lembre-se de 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 a ErrorStatus.htm:

    <HTML>
        <HEAD>
            <TITLE></TITLE>
            <META NAME="GENERATOR" Content="Microsoft Visual Studio 7.0">
        </HEAD>
        <BODY>
             <b>Custom Error page!</b>
             <br>
             You have been redirected here from the <customErrors> section of the
             Web.config file.
        </BODY>
    </HTML>
    
  6. Para testar o código, salve os arquivos, compile 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 fazer referência a uma página de erro padrão no valor do defaultRedirect atributo na <customErrors> seção, também é possível especificar uma página específica para redirecionar com base no código de erro HTTP 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 (o que os Page_Error exemplos e Application_Error fazem), você deve armazenar a exceção em uma variável de sessão ou 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 ocorre o redirecionamento de erro. Por exemplo, se você estiver desenvolvendo o aplicativo, provavelmente desejará ver as mensagens de erro ASP.NET reais e não deseja ser redirecionado para a página de erro mais amigável. O mode atributo inclui as seguintes configurações:

  • On: Exceções sem tratamento 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 é padronizada para uma conta local sem privilégios chamada conta ASPNET . Nas versões beta do ASP.NET, a identidade do processo era System, uma conta administrativa poderosa com muitos privilégios na máquina.

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 é padronizada 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 podem precisar de direitos de acesso adicionais, consulte padrões e práticas

Referências