ASP.NET - Tratamento e personalização de erros


Você deseja substituir as mensagens de erro genéricas exibidas nas páginas ASP.NET de sua aplicação por suas próprias mensagens de erros personalizadas ?

Antes de responder a sua pergunta vou revisar o básico sobre como os erros são tratados em páginas ASP.NET...

Quando ocorre um erro em uma página a ASP.NET envia a informação sobre o erro para o cliente. Os erros podem ser divididos em 4 categorias:

Por padrão a informação exibida para um erro de run-time é a chamada da pilha (call-stack). Se o modo debug estiver habilitado, a ASP.NET exibe o número de linha no código fonte onde o erro de run-time foi originado. O modo Debug é uma ferramenta valiosa para sua aplicação. Para habilitar o modo debug a nível de página , utilize a seguinte diretiva:

<%@ Page Debug="true" %>

Você pode também habilitar o modo debug a nível de aplicação usando o arquivo web.config no diretório raiz da sua aplicação. A seguir temos um exemplo :

Abra o Visual Web Developer e crie um novo web site. Na página Default.aspx insira o seguinte código:

<%@ Debug="true"%>

<html>

  <script language="VB" runat="server">

    ' Definindo o mood Debug como igual a True faz com que o número de linha seja exibido para erros de run-time 
    Sub Error_500(sender As Object, e As EventArgs)
        Dim nada As String = Nothing
        Response.Write(nada.ToString())
    End Sub

  </script>

  <body>
    <form runat="server">
      <h4><font face="verdana">Força a ocorrencia de um erro...</font></h4>
      <asp:button text="500 Erro de Servidor" OnClick="Error_500"  width="150" runat="server"/><p>
    </form>
  </body>

</html>

O modo Design desta página é o exibido a seguir:

Agora respondendo ao seu questionamento de forma bem objetiva , você deve fazer o seguinte:

1- Localizar o arquivo web.config no diretório raiz da sua aplicação ( ou criar um se ele não existir)
2- Inclua um elemento <customErrors> ao arquivo web.config e um elemento filho <error> para cada erro personalizado que você deseja exibir
3- Crie as páginas de erros personalizadas

Exemplo de arquivo web.config :

<configuration>
<system.web>
    <customErrors defaultRedirect="erroGenerico.htm" mode="RemoteOnly" />
</system.web>
</configuration>

O comportamento padrão da ASP.NET é exibir páginas de erros próprias para qualquer erro padrão que ocorra no servidor, como por exemplo 401 (acesso negado) , 404 (página não encontrada) ou 500 (erro interno de servidor). Quase sempre a página de erro exibida não irá ter a mesma aparência da interface da sua aplicação e nem irá fornecer a informação que você ache mais conveniente para os usuários de sua aplicação.

A ASP.NET fornece a possibilidade, via web.config, de você configurar suas próprias mensagens de erro. De forma similar este recurso também esta disponível no Internet Information Server (IIS), mas utilizar o web.config é mais simples pois você pode alterar apenas um arquivo e pode movê-lo para outro servidor apenas copiando o web.config e as páginas de erro para o novo local.

Primeiro você deve incluir o elemento <customErrors> ao seu arquivo web.config como filho de <system.web>. O atributo mode define quando e onde a página de erro customizada será exibida. Defina o atributo mode para RemoteOnly para ter a página de erro customizada sendo exibida somente quando o acesso a aplicação for feito por uma máquina remota. Ao definir o atributo mode como RemoteOnly , as páginas de erros ASP.NET não serão exibidas quando o acesso a aplicação for feito da máquina local. Se você definir o atributo com valor igual a Off as mensagens de erros serão exibidas na máquina local e remota.

O atributo defaultRedirect define a página de erro customizada que será exibida se um erro ocorrer e não houver um elemento error específico para o erro. Por padrão o atributo defaultRedirect é definido como sendo GenericErrorPage. Você pode incluir parâmetros na URL se assim desejar.

A seguir inclua um elemento error para cada erro de servidor que você deseja redirecionar para uma página de erro customizada. Defina o atributo statusCode para o código de erro do servidor e defina o atributo redirect para a URL da página que será exibida quando o erro ocorrer.

Quando o erro for 404 (página não encontrada), por exemplo, a ASP.NET inclui o parâmetro na URL para indicar o nome da página requisitada que não foi encontrada. A URL para o redirecionamento do erro 404 descrito seria:

 http://[servidor]/macoratti/PaginaErro.aspx?aspxerrorpath=/ASPNet/PaginaInvalida.aspx

Sua aplicação pode também usar a coleção Request.QueryString para retornar o nome da página que não foi localizada e incluir a informação na sua página personalizada:

labelMensagem.Text = Request.QueryString("aspxerrorpath") & " Não esta disponível neste site"

Exemplo de página ASP.NET usando Request.QueryString:

<%@ Page Language="VB" Description="Error page"%>

<html>
<head>
<title>Página de Erro</title>
</head>

<body>
<h1>Página de erro</h1>
        Erro originado em: <%=Request.QueryString("ErrorPage") %>
</body>
</html>

A seguir um exemplo de erros customizados no web.config usando as configurações para <customErrors> e <error>:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <customErrors mode="RemoteOnly" defaultRedirect="/erroGenerico.htm">
      <error statusCode="500" redirect="/error/suporte.htm"/>
      <error statusCode="404" redirect="/error/paginaNaoEncontrada.aspx"/>
      <error statusCode="403" redirect="/error/semAcesso.aspx"/>
    </customErrors>
  </system.web>
</configuration>

O atributo StatusCode indica o status HTTP do erro para o qual a página de erro personalizada será usada. Ex: 404 Not Found, 500 Internal Server Error.

Você também pode efetuar o tratamento de erros via código, a nível de página ou de aplicação. A classe base Page expõe o método Page_Error o qual você pode sobrescrever em suas páginas. O método é chamado sempre que uma exceção não tratada for disparada em tempo de execução:

Abaixo temo um exemplo de utilização do método Page_Error:

<script language="VB" runat="server">

Sub Page_Error(Source As Object, E As EventArgs)

Dim msg As String = "<font face=verdana color=red>" _
                                    & "<h4>" & Request.Url.ToString() & "</h4>" _
                                    & "<pre><font color='red'>" _
                                    & Server.GetLastError().ToString() & "</pre>" _
                                    & "</font>"

Response.Write(msg)
End Sub

</script>

Para efetuar o tratamento a nível de aplicação você deve usar o evento Application_Error no arquivo Global.asax; este evento ocorre para qualquer exceção não tratada na aplicação:

Eu sei, é apenas ASP.NET, mas eu gosto...


José Carlos Macoratti