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.
Siga estas etapas para adicionar um novo arquivo chamado PageEvent.aspx ao seu projeto:
- Abra o Visual Studio .NET.
- 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.
- Na caixa de texto Nome, digite PageEvent.aspx e clique em Abrir.
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>
No menu Arquivo , clique em Salvar PageEvent.aspx.
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:
Adicione um novo arquivo chamado AppEvent.aspx ao seu projeto.
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>
No menu Arquivo , clique em Salvar AppEvent.aspx.
Adicione o
Application_Error
evento ao arquivo Global.asax para interceptar o erro que você lança noPage_Load
evento da página AppEvent.aspx . Observe que você deve adicionar umaImports
instrução para oSystem.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
Salve o arquivo Global.asax .
No Visual Studio .NET, no menu Compilar , clique em Compilar.
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.
Abra o arquivo Global.asax do exemplo anterior.
Comente a
Server.ClearError
linha para garantir que o erro apareça no arquivo Web.config .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
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.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>
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 especificadadefaultRedirect
. Issomode
é usado principalmente na produção.Off
: os usuários recebem as informações de exceção e não são redirecionados para adefaultRedirect
página. Issomode
é 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 adefaultRedirect
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