Compartilhar via


Concluir exemplo para manipuladores de erro

Este exemplo de código inclui elementos para tanto manipulação de exceção de nível de página e nível de aplicação.

Arquivos de código de exemplo

Os arquivos nesse exemplo de código são da seguinte maneira:

  • Web.config

  • O arquivo Global.asax

  • Padrão.aspx

  • ExceptionUtility (para ser colocado na pasta App_Code)

  • GenericErrorPage.aspx

  • HttpErrorPage.aspx

Web.config

O exemplo a seguir fornece o arquivo web.config.A configuração inicial de customErrors fará com que os erros não tratados sejam direcionados para o arquivo HttpErrorPage.aspx.

<configuration>
  <appSettings/>
  <connectionStrings/>
  <system.web>
    <compilation debug="true" />

    <!-- Turn on Custom Errors -->
    <customErrors 
      mode="RemoteOnly"
      defaultRedirect="HttpErrorPage.aspx">
    </customErrors >

  </system.web>
</configuration>

O arquivo Global.asax

O exemplo a seguir fornece o arquivo Global.asax.Para ativar a manipulador de eventos de erro no arquivo Global.asax, você precisará modificar o arquivo web.config.O arquivo de configuração terá precedência.Portanto, você pode definir customErrors como Off ou remover a configuração defaultRedirect.Se o arquivo de configuração Web.config tiver customErrors definida como Off, o manipulador de eventos Application_Error no Global.asax processará todos os erros não tratados.

Observação de segurança:

Nunca defina customErrors para Off no arquivo Web.config se você não tiver um manipulador Application_Error no arquivo Global.asax.Informações potencialmente comprometedoras sobre seu site da Web podem ser expostas a qualquer pessoa que pode causar um erro no seu site.

void Application_Error(object sender, EventArgs e) 
{ 
    // Code that runs when an unhandled error occurs
    // Give the user some information, but
    // stay on the default page
    Exception exc = Server.GetLastError();
    Response.Write("<h2>Global Page Error</h2>\n");
    Response.Write(
        "<p>" + exc.Message + "</p>\n");
    Response.Write("Return to the <a href='Default.aspx'>" +
        "Default Page</a>\n");

    // Log the exception and notify system operators
    ExceptionUtility.LogException(exc, "DefaultPage");
    ExceptionUtility.NotifySystemOps(exc);

    // Clear the error from the server
    Server.ClearError();
}

ExceptionUtility

O exemplo a seguir fornece o arquivo ExceptionUtility.Logs de erro podem ser direcionados para arquivo ErrorLog do computador, ou, se o computador fizer parte de uma Web farm, o log de erros pode ser gravado em um arquivo de texto globalmente disponível, ou mesmo em um banco de dados.Talvez também precise imediatamente notificar os administradores do sistema de um problema.A seguir ExceptionUtility tem dois métodos estático: uma para registrar a exceção e outra para notificar os administradores de sistema.Como esses métodos são implementados no seu código depende da necessidades da sua organização.Para esse exemplo, você deve conceder permissões de gravação para o serviço de rede para a pasta App_Data para ativar o aplicativo a fim de gravar o log de erros.

using System;
using System.IO;
using System.Web;

// Create our own utility for exceptions
public sealed class ExceptionUtility
{
    // All methods are static, so this can be private
    private ExceptionUtility()
    { }

    // Log an Exception
    public static void LogException(Exception exc, string source)
    {
        // Include enterprise logic for logging exceptions
        // Get the absolute path to the log file
        string logFile = "App_Data/ErrorLog.txt";
        logFile = HttpContext.Current.Server.MapPath(logFile);

        // Open the log file for append and write the log
        StreamWriter sw = new StreamWriter(logFile, true);
        sw.Write("******************** " + DateTime.Now);
        sw.WriteLine(" ********************");
        if (exc.InnerException != null)
        {
            sw.Write("Inner Exception Type: ");
            sw.WriteLine(exc.InnerException.GetType().ToString());
            sw.Write("Inner Exception: ");
            sw.WriteLine(exc.InnerException.Message);
            sw.Write("Inner Source: ");
            sw.WriteLine(exc.InnerException.Source);
            if (exc.InnerException.StackTrace != null)
                sw.WriteLine("Inner Stack Trace: ");
            sw.WriteLine(exc.InnerException.StackTrace);
        }
        sw.Write("Exception Type: ");
        sw.WriteLine(exc.GetType().ToString());
        sw.WriteLine("Exception: " + exc.Message);
        sw.WriteLine("Source: " + source);
        sw.WriteLine("Stack Trace: ");
        if (exc.StackTrace != null)
            sw.WriteLine(exc.StackTrace);
        sw.WriteLine();
        sw.Close();
    }

    // Notify System Operators about an exception
    public static void NotifySystemOps(Exception exc)
    {
        // Include code for notifying IT system operators
    }
}

Padrão.aspx

O exemplo a seguir fornece a página default.aspx.Esse arquivo fornece três botões, cada um deles gera uma exceção diferente.O manipulador Page_Error na página filtra erros específicos e lida com essas três exceções de três maneiras diferentes.Ele também fornece um link para um arquivo inexistente, que fornece um quarto tipo de erro que não é tratado na página.

<%@ Page Language="C#" %>

<script >
    protected void Submit_Click(object sender, EventArgs e)
    {
        string arg = ((Button)sender).CommandArgument;

        if (arg.Equals("1"))
        {
            // Exception handled on the Generic Error Page
            throw new InvalidOperationException("Invalid click operation?!");
        }
        else if (arg.Equals("2"))
        {
            // Exception handled on the current page
            throw new ArgumentOutOfRangeException("click?!");
        }
        else
        {
            // Exception handled on the Http Error Page (per Web.Config)
            throw new Exception("Generic click problem?!");
        }
    }
    private void Page_Error(object sender, EventArgs e)
    {
        // Get last error from the server
        Exception exc = Server.GetLastError();

        // Filter for a specific kind of exception
        if (exc is ArgumentOutOfRangeException)
        {
            // Give the user some information, but
            // stay on the default page
            Response.Write("<h2>Default Page Error</h2>\n");
            Response.Write( 
                "<p>ArgumentOutOfRange: Your click must have " +
                "been out of range?!</p>\n");
            Response.Write("Return to the <a href='Default.aspx'>" +
                "Default Page</a>\n");

            // Log the exception and notify system operators
            ExceptionUtility.LogException(exc, "DefaultPage");
            ExceptionUtility.NotifySystemOps(exc);

            // Clear the error from the server
            Server.ClearError();

        }
        // Filter for other kinds of exceptions
        else if (exc is InvalidOperationException)
        {
            // Pass the error on to the Generic Error page
            Server.Transfer("GenericErrorPage.aspx", true);
        }
        else
        {
            // Pass the error on to the default global handler
        }
    }
</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>Exception Handler Page</title>
</head>
<body>
    <form id="form1" >
    <div>

    <h2>Default Page</h2>
        <p>
            Click this button to create a InvalidOperationException.<br />
            <asp:Button ID="Submit1"  CommandArgument="1" 
                OnClick="Submit_Click" Text="Click 1" />
        </p>
        <p>
            Click this button to create a ArgumentOutOfRangeException.<br />
            <asp:Button ID="Submit2"  CommandArgument="2" 
                OnClick="Submit_Click" Text="Click 2" />
        </p>
        <p>
            Click this button to create a generic Exception.<br />
            <asp:Button ID="Submit3"  CommandArgument="3" 
                OnClick="Submit_Click" Text="Click 3" />
        </p>

        <p>Click this link to attempt to access a non-existent page:<br />
        <a href="NoPage.aspx">NoPage.aspx</a>
    </p>

    </div>
    </form>
</body>
</html>

GenericErrorPage.aspx

O exemplo a seguir fornece a página GenericErrorPage.aspx.Esta página cria uma mensagem de segurança que ele exibe aos usuários remotos.Para usuários locais (os desenvolvedores e os testadores do aplicativo), a página exibe um relatório completo de exceção.

<%@ Page Language="C#" %>

<script >
    protected Exception ex = null;

    protected void Page_Load(object sender, EventArgs e)
    {
        // Get the last error from the server
        Exception ex = Server.GetLastError();

        // Create a safe message
        string safeMsg = "A problem has occurred in the web site. ";

        // Show Inner Exception fields for local access
        if (ex.InnerException != null)
        {
            innerTrace.Text = ex.InnerException.StackTrace;
            InnerErrorPanel.Visible = Request.IsLocal;
            innerMessage.Text = ex.InnerException.Message;
        }
        // Show Trace for local access
        if (Request.IsLocal)
            exTrace.Visible = true;
        else
            ex = new Exception(safeMsg, ex);

        // Fill the page fields
        exMessage.Text = ex.Message;
        exTrace.Text = ex.StackTrace;

        // Log the exception and notify system operators
        ExceptionUtility.LogException(ex, "Generic Error Page");
        ExceptionUtility.NotifySystemOps(ex);

        // Clear the error from the server
        Server.ClearError();
    }
</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>Generic Error Page</title>
</head>
<body>
    <form id="form1" >
    <div>

    <h2>Generic Error Page</h2>
    <asp:Panel ID="InnerErrorPanel"  Visible="false">
        <p>
            Inner Error Message:<br />
            <asp:Label ID="innerMessage"  
                Font-Bold="true" Font-Size="Large" /><br />
        </p>
        <pre>
<asp:Label ID="innerTrace"  />
        </pre>
    </asp:Panel>
    <p>
        Error Message:<br />
        <asp:Label ID="exMessage"  
            Font-Bold="true" Font-Size="Large" />
    </p>
    <pre>
<asp:Label ID="exTrace"  visible="false" />
    </pre>

    </div>
    </form>
</body>
</html>

HttpErrorPage.aspx

O exemplo a seguir fornece a página HttpErrorPage.aspx.Essa página também cria uma mensagem segura que depende do valor do código de erro, que ele exibe aos usuários remotos.Para usuários locais, a página exibe um relatório completo de exceção.

<%@ Page Language="C#" %>

<script >
    protected HttpException ex = null;

    protected void Page_Load(object sender, EventArgs e)
    {
        ex = (HttpException)Server.GetLastError();
        string safeMsg = String.Empty;

        // Filter for Error Codes and set text
        if (ex.ErrorCode >= 400 && ex.ErrorCode < 500)
        {
            ex = new HttpException
                (ex.ErrorCode, 
                    "Your file could not be found or " +
                    "there was an access problem.", ex);
        }
        else if (ex.ErrorCode > 499)
            ex = new HttpException
                (ex.ErrorCode, 
                    "There was an error on the server.", ex);
        else
            ex = new HttpException
                (ex.ErrorCode, 
                "There was a problem " +
                    "with the web site.", ex);

        // Log the exception and notify system operators
        ExceptionUtility.LogException(ex, "HttpErrorPage");
        ExceptionUtility.NotifySystemOps(ex);

        // Fill the page fields
        exMessage.Text = ex.Message;
        exTrace.Text = ex.StackTrace;

        // Show Inner Exception fields for local access
        if (ex.InnerException != null)
        {
            innerTrace.Text = ex.InnerException.StackTrace;
            InnerErrorPanel.Visible = Request.IsLocal;
            innerMessage.Text = ex.InnerException.Message;
        }
        // Show Trace for local access
        exTrace.Visible = Request.IsLocal;

        // Clear the error from the server
        Server.ClearError();
    }
</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>Generic Error Page</title>
</head>
<body>
    <form id="form1" >
    <div>

    <h2>Http Error Page</h2>    
    <asp:Panel ID="InnerErrorPanel"  Visible="false">
        <asp:Label ID="innerMessage"  
            Font-Bold="true" Font-Size="Large" /><br />
        <pre>
<asp:Label ID="innerTrace"  />
        </pre>
    </asp:Panel>
    Error Message:<br />
    <asp:Label ID="exMessage"  
        Font-Bold="true" Font-Size="Large" />
    <pre>
<asp:Label ID="exTrace"  visible="false" />
    </pre>

    </div>
    </form>
</body>
</html>

Consulte também

Tarefas

Como: Manipular erros de página

Como: Manipular erros de aplicativo

Outros recursos

Tratamento de erro em páginas e aplicativos ASP.NET