Condividi tramite


Eccezioni e gestione delle eccezioni

Le funzionalità di gestione delle eccezioni del linguaggio C# consentono di gestire eventuali situazioni impreviste o eccezionali che si verificano quando un programma è in esecuzione. La gestione delle eccezioni usa le parole chiave try, catche finally per provare azioni che potrebbero non riuscire, per gestire gli errori quando si decide che è ragionevole eseguire questa operazione e pulire le risorse in un secondo momento. Le eccezioni possono essere generate da Common Language Runtime (CLR), da librerie .NET o di terze parti o dal codice dell'applicazione. Le eccezioni vengono create usando 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. Quando viene generata un'eccezione, CLR rimuoverà lo stack, cercando un metodo con un blocco di catch per il tipo di eccezione specifico ed eseguirà il primo blocco di catch trovato. Se non trova alcun blocco catch appropriato in qualsiasi punto dello stack di chiamate, terminerà il processo e visualizzerà un messaggio all'utente.

In questo esempio un metodo verifica la divisione per zero e rileva l'errore. Senza la gestione delle eccezioni, questo programma terminerebbe con un errore DivideByZeroException non gestito.

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($"{a} divided by {b} = {result}");
        }
        catch (DivideByZeroException)
        {
            Console.WriteLine("Attempted divide by zero.");
        }
    }
}

Panoramica delle eccezioni

Le eccezioni hanno le proprietà seguenti:

  • Le eccezioni sono tipi che alla fine derivano da System.Exception.
  • Usare un blocco try intorno alle istruzioni che potrebbero generare eccezioni.
  • Quando si verifica un'eccezione nel blocco try, il flusso del controllo passa al primo gestore eccezioni associato presente in qualsiasi punto dello stack di chiamate. In C# la parola chiave catch viene usata per definire un gestore eccezioni.
  • Se non è presente alcun gestore 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 intercetti System.Exception, rilancialo usando 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 tutti i flussi o i file aperti nel blocco try.
  • Le eccezioni gestite in .NET vengono implementate oltre al meccanismo di gestione delle eccezioni strutturate Win32. Per ulteriori informazioni, vedere Gestione delle eccezioni strutturate (C/C++) e Un corso rapido sui dettagli della gestione delle eccezioni strutturate 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#.

Vedere anche