Condividi tramite


Esempio completo di gestori di errori

Aggiornamento: novembre 2007

Questo esempio di codice include elementi per la gestione delle eccezioni a livello di pagina e a livello di applicazione.

File dell'esempio di codice

I file di questo esempio di codice sono i seguenti:

  • Web.config

  • Global.asax

  • Default.aspx

  • ExceptionUtility (da inserire nella cartella App_Code)

  • GenericErrorPage.aspx

  • HttpErrorPage.aspx

Web.config

Nell'esempio seguente viene fornito il file Web.config. A causa dell'impostazione iniziale di customErrors gli errori non gestiti verranno diretti al file HttpErrorPage.aspx.

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

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

  </system.web>
</configuration>

Global.asax

Nell'esempio seguente viene fornito il file Global.asax. Per attivare il gestore eventi degli errori nel file Global.asax, sarà necessario modificare il file Web.config. Il file di configurazione ha la precedenza. Pertanto, è necessario impostare customErrors su Off oppure rimuovere l'impostazione defaultRedirect. Se nel file di configurazione Web.config customErrors è impostato su Off, il gestore eventi Application_Error in Global.asax elaborerà tutti gli errori non gestiti.

Nota sulla sicurezza:

Non impostare mai customErrors su Off nel file Web.config se non è presente un gestore Application_Error nel file Global.asax. È possibile che chi sia in grado di causare un errore nel sito venga a conoscenza di informazioni potenzialmente compromettenti sul sito Web.

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

Nell'esempio seguente viene fornito il file ExceptionUtility. I log degli errori potrebbero essere diretti al file ErrorLog del computer oppure, se il computer fa parte di una Web farm, il log degli errori potrebbe essere registrato in un file di testo disponibile a livello globale o in un database. Potrebbe inoltre essere necessario notificare immediatamente gli amministratori di sistema in caso si verifichi un problema. Il file ExceptionUtility seguente ha due metodi statici: uno per registrare l'eccezione e uno per notificare gli amministratori di sistema. La modalità di implementazione di tali metodi nel codice dipende dalle esigenze dell'organizzazione. Per questo esempio, è necessario concedere autorizzazioni di scrittura all'account SERVIZIO DI RETE per la cartella App_Data per consentire all'applicazione di scrivere nel log degli errori.

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
    }
}

Default.aspx

Nell'esempio seguente viene fornita la pagina Default.aspx. Questo file fornisce tre pulsanti, che generano un'eccezione diversa. Il gestore Page_Error nella pagina filtra in base a errori specifici e gestisce queste tre eccezioni in tre modi diversi. Offre inoltre un collegamento a un file inesistente che fornisce un quarto tipo di errore che non è gestito nella pagina.

<%@ 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

Nell'esempio seguente viene fornita la pagina GenericErrorPage.aspx. Questa pagina crea un messaggio sicuro da visualizzare agli utenti remoti. Per gli utenti locali (sviluppatori e tester dell'applicazione) la pagina visualizza un report di eccezioni completo.

<%@ 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

Nell'esempio seguente viene fornita la pagina HttpErrorPage.aspx. Questa pagina crea un messaggio che dipende dal valore del codice di errore da visualizzare agli utenti remoti. Per gli utenti locali, la pagina visualizza un report di eccezioni completo.

<%@ 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>

Vedere anche

Attività

Procedura: gestire errori a livello di pagina

Procedura: gestire errori a livello di applicazione

Altre risorse

Gestione degli errori nelle pagine e nelle applicazioni ASP.NET