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 chiavecatch
. - 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 chiavethrow
alla fine del bloccocatch
. - 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 bloccofinally
per rilasciare le risorse, ad esempio per chiudere eventuali flussi o file aperti nel bloccotry
. - 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#.