domingo, 30 de março de 2008

ASP.NET, tratando exceções não tratadas

Quando as exceções não são tratadas e recuperadas internamente em nossa aplicação o ASP.NET ainda fornece maneiras para logarmos, liberar recursos e fazer qualquer outro processamento necessário antes de mostrarmos a exceção para o usuários.

Para isto é possível utilizar dos eventos Page_Error e Application_Error, um programado na página e o segundo no global.asax. Dentro destes eventos podemos então chamar o método Server.GetLastError() para obtermos a exception que está ocasionando o erro e podemos também, se só tivermos que logar ou fazer outra manipulação, chamar o método Server.ClearError(), para que o erro não continue sendo propagado.

Na imagem 1, estamos programando o evento da página para adicionar informações ao trace, que permitirá a análise da requisição.



Imagem 1 - Programando o Page_Error

Para programar o evento Page_Error, somente criamos o método com o nome, parâmetros e retorno acima e este foi chamado devido ao atributo AutoEventWireup da diretiva @Page estar definido para true, conforme Imagem 2.



Imagem 2 - Atributo AutoEventWireup

No global.asax podemos programar o método Application_Error que deve ser utilizado para logar, armazenar informações, enviar notificações e outros procedimentos sobre o erro. Veja na Imagem 3.



Imagem 3 - Application_Error

Na página é possível também configurar o atributo ErrorPage, para definir qual página será executada ao acontecer um erro não tratado.

Configurando o Web.config

No web.config, no elemento customErros, podemos configurar qual a página de erro padrão e página de erros para os diferentes códigos de errors HTTP. O atributo mode do elemento customErrors pode ter os seguintes valores:

  • On
    Exceções não manipuladas redirecionarão o usuário a página configurada no atributo defaultRedirect. Este é utilizado mais frequentemente em produção.
  • Off
    Usuários visualizarão as informações de exceção da página padrão de erro padrão do ASP.NET, esta mostra várias informações sobre o erro. Utilizado frequentemente no desenvolvimento.
  • RemoteOnly
    Usuário acessando a máquina usando localhost na url visualizarão o erro padrão do ASP.NET, enquanto usuários remotos serão redirecionados para a página configurada no atributo defaultRedirect

Veja um exemplo de configuração na Imagem 4

Imagem 4 – customErrors no web.config

Referências:

http://msdn2.microsoft.com/en-us/library/ms954599.aspx

http://msdn2.microsoft.com/en-us/library/ms972393.aspx

http://msdn2.microsoft.com/en-us/library/aa479319.aspx