Eccezioni e gestione delle eccezioni

Le funzionalità di gestione delle eccezioni del linguaggio C# sono utili per gestire qualsiasi situazione imprevista o eccezionale che può verificarsi durante l'esecuzione di un programma. Per la gestione delle eccezioni vengono usate le parole chiave try, catch e finally per provare a eseguire azioni che potrebbero non riuscire, per gestire gli errori quando si decide che è ragionevole farlo e per pulire le risorse in un secondo momento. Le eccezioni possono essere generate da CLR (Common Language Runtime), da .NET o librerie di terze parti o dal codice dell'applicazione. Per creare le eccezioni viene usata la parola chiave throw.

In molti casi, un'eccezione può essere generata non da un metodo che chiamato direttamente dal codice, ma da qualsiasi metodo più in basso nello stack di chiamate. Quando viene generata un’eccezione, CLR ripercorrerà lo stack alla ricerca di un metodo con un blocco catch per il tipo di eccezione specifico ed eseguirà il primo blocco catch 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 divisioni per zero e intercetta l'errore. Senza la gestione delle eccezioni, il programma verrebbe chiuso con un errore DivideByZeroException non è stata gestita.

public class ExceptionTest
{
    static double SafeDivision(double x, double y)
    {
        if (y == 0)
            throw new DivideByZeroException();
        return x / y;
    }

    public static void Main()
    {
        // Input for test purposes. Change the values to see
        // exception handling behavior.
        double a = 98, b = 0;
        double result;

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

Panoramica delle eccezioni

Le eccezioni hanno le proprietà seguenti:

  • Le eccezioni sono tipi che derivano fondamentalmente tutti da System.Exception.
  • Racchiudere all'interno di un blocco try le istruzioni che potrebbero generare un'eccezione.
  • Quando si verifica un'eccezione nel blocco try, il flusso di controllo passa al primo gestore delle eccezioni associato presente in qualsiasi punto nello stack di chiamate. In C#, per definire un gestore di eccezioni viene usata la parola chiave catch.
  • Se non è presente alcun gestore di eccezioni per una determinata eccezione, il programma interrompe l'esecuzione con un messaggio di errore.
  • Non intercettare un'eccezione a meno che non sia possibile gestirla e lasciare l'applicazione in uno stato noto. Se si intercetta System.Exception, generare di nuovo l'eccezione tramite la parola chiave throw alla fine del blocco catch.
  • Se un blocco catch definisce una variabile di eccezione, è possibile usarla per ottenere altre informazioni sul tipo di eccezione che si è verificato.
  • Le eccezioni possono essere generate in modo esplicito da un programma usando la parola chiave throw.
  • Gli oggetti eccezione contengono informazioni dettagliate sull'errore, ad esempio lo stato dello stack di chiamate e una descrizione testuale dell'errore.
  • Il codice in un blocco finally viene eseguito indipendentemente dal fatto che venga generata un'eccezione. Usare un blocco finally per rilasciare le risorse, ad esempio per chiudere eventuali flussi o file aperti nel blocco try.
  • Le eccezioni gestite in .NET Framework vengono implementate sulla base del meccanismo di gestione strutturata delle eccezioni in Win32. Per altre informazioni, vedere Gestione strutturata delle eccezioni (C/C++) e A Crash Course on the Depths of Win32 Structured Exception Handling (Corso intensivo su tutti i concetti fondamentali della gestione delle eccezioni strutturata in Win32).

Specifiche del linguaggio C#

Per altre informazioni, vedere Eccezioni nella Specifica del linguaggio C#. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.

Vedi anche