Share via


Eccezioni e gestione delle eccezioni (Guida per programmatori C#)

Aggiornamento: Luglio 2008

Le funzionalità di gestione delle eccezioni del linguaggio C# consentono di gestire situazioni impreviste o eccezionali che si verificano durante l'esecuzione di un programma. Nella gestione delle eccezioni vengono utilizzate le parole chiave try, catch e finally per tentare di eseguire azioni che potrebbero non riuscire, per gestire gli errori quando lo si ritiene opportuno e per pulire successivamente le risorse. Le eccezioni possono essere generate da Common Language Runtime (CLR), da librerie .NET Framework o di altri produttori o dal codice dell'applicazione. Le eccezioni vengono create tramite la parola chiave throw.

In molti casi, un'eccezione può essere generata non da un metodo chiamato direttamente dal codice, ma da un altro metodo più in basso nello stack di chiamate. In questa situazione, CLR rimuoverà lo stack, alla ricerca di un metodo con un blocco catch per il tipo di eccezione specifico ed eseguirà il primo blocco catch di questo tipo trovato. Se non trova un blocco catch appropriato nello stack di chiamate, terminerà il processo e visualizzerà un messaggio all'utente.

In questo esempio un metodo verifica la presenza di una divisione per zero e rileva l'errore. Senza la gestione delle eccezioni, il programma verrebbe chiuso con un errore simile al seguente: DivideByZeroException non è stata gestita.

class ExceptionTest
{
    static double SafeDivision(double x, double y)
    {
        if (y == 0)
            throw new System.DivideByZeroException();
        return x / y;
    }
    static void Main()
    {
        // Input for test purposes. Change values
        // to see exception handling behavior.
        double a = 98, b = 0;
        double result = 0;

        try
        {
            result = SafeDivision(a, b);
            Console.WriteLine("{0} divided by {1} = {2}", a, b, result);
        }
        catch (DivideByZeroException e)
        {
            Console.WriteLine("Attempted divide by zero.");
        }
    }
}

Cenni preliminari sulle eccezioni

Le eccezioni dispongono delle seguenti proprietà:

  • Le eccezioni sono tipi che derivano tutti da System.Exception.

  • Utilizzare un blocco try intorno alle istruzioni che potrebbero generare eccezioni.

  • Quando si verifica un'eccezione nel blocco try, il flusso di controllo passa al primo gestore eccezioni associato presente in qualsiasi punto dello stack di chiamate. Per la definizione di un gestore eccezioni, in C# viene utilizzata la parola chiave catch.

  • Se per una determinata eccezione non sono presenti gestori, l'esecuzione del programma verrà interrotta con un messaggio di errore.

  • Non rilevare un'eccezione a meno che non sia possibile gestirla e lasciare l'applicazione in uno stato conosciuto. Se si rileva System.Exception, effettuarne una nuova generazione utilizzando la parola chiave throw alla fine del blocco catch.

  • Se un blocco catch definisce una variabile di eccezione, è possibile utilizzarla per ottenere ulteriori informazioni sul tipo di eccezione che si è verificata.

  • Le eccezioni possono essere generate in modo esplicito da un programma mediante la parola chiave throw.

  • Gli oggetti eccezione contengono informazioni dettagliate sull'errore, ad esempio lo stato dello stack di chiamate e una descrizione dell'errore.

  • Il codice in un blocco finally viene eseguito anche se viene generata un'eccezione. Utilizzare un blocco finally per rilasciare risorse, ad esempio per chiudere qualsiasi flusso o file aperto nel blocco try.

  • Le eccezioni gestite in .NET Framework vengono implementate nel meccanismo di gestione delle eccezioni strutturata in Win32. Per ulteriori informazioni, vedere Structured Exception Handling (C++) e A Crash Course on the Depths of Win32 Structured Exception Handling (il contenuto potrebbe essere in inglese).

Sezioni correlate

Per ulteriori informazioni sulle eccezioni e sulla relativa gestione, vedere i seguenti argomenti:

Specifiche del linguaggio C#

Per ulteriori informazioni, vedere le sezioni riportate di seguito in Specifiche del linguaggio C#:

  • 8.9.5 Istruzione throw

  • 8.10 Istruzione try

  • 16 Eccezioni

Vedere anche

Concetti

Guida per programmatori C#

Cenni preliminari sulle eccezioni

Riferimenti

Parole chiave di C#

throw (Riferimenti per C#)

try-catch (Riferimenti per C#)

try-finally (Riferimenti per C#)

try-catch-finally (Riferimenti per C#)

Altre risorse

Linee guida di progettazione delle eccezioni

Gestione e generazione di eccezioni

Scrittura di codice .NET affidabile (informazioni in lingua inglese)

Cronologia delle modifiche

Data

Cronologia

Motivo

Luglio 2008

Esempio di codice modificato e aggiunto testo sulla rimozione dello stack.

Correzione di errori nel contenuto.

Luglio 2008

Aggiunto esempio per spiegare il blocco finally.

Miglioramento delle informazioni.

Luglio 2008

Aggiunte informazioni sul meccanismo di gestione delle eccezioni strutturata in Win32.

Miglioramento delle informazioni.