Gestione e generazione di eccezioni in .NET

Le applicazioni devono essere in grado di gestire in modo coerente gli errori che si verificano durante l'esecuzione. .NET offre un modello coerente per l'invio alle applicazioni di notifiche relative agli errori: le operazioni di .NET indicano l'errore generando eccezioni.

Eccezioni

Un'eccezione è una condizione di errore o un comportamento imprevisto riscontrato da un programma in esecuzione. Eccezioni possono essere generate in caso di errori nel codice dell'applicazione o nel codice chiamato (ad esempio una libreria condivisa), in caso di risorse del sistema operativo non disponibili, di condizioni impreviste riscontrate dal runtime (ad esempio codice impossibile da verificare) e così via. L'applicazione è in grado di gestire alcune di queste condizioni, altre no. Sebbene sia possibile gestire gran parte delle eccezioni dell'applicazione, la maggior parte delle eccezioni di runtime risulta ingestibile.

In .NET un'eccezione è un oggetto che eredita dalla classe System.Exception. Le eccezioni vengono generate dalle aree di codice in cui si è verificato un problema. Ogni eccezione viene passata ai livelli superiori dello stack finché non viene gestita dall'applicazione o non si arresta il programma.

Confronto tra eccezioni e metodi di gestione degli errori tradizionali

In precedenza, il modello di gestione degli errori di un linguaggio si basava sul metodo specifico usato da tale linguaggio per rilevare gli errori e individuarne i gestori oppure sul meccanismo di gestione degli errori fornito dal sistema operativo. La modalità di gestione delle eccezioni di .NET offre i vantaggi seguenti:

  • La generazione e la gestione delle eccezioni ha lo stesso funzionamento nei linguaggi di programmazione .NET.

  • Senza la necessità di una sintassi di linguaggio apposita, ma con la possibilità per ciascun linguaggio di definire la propria sintassi.

  • È possibile generare eccezioni anche a livello di più processi e addirittura di più computer differenti.

  • È possibile aggiungere codice per la gestione delle eccezioni a un'applicazione per aumentare l'affidabilità dei programmi.

Le eccezioni presentano vantaggi rispetto ad altri metodi di notifica degli errori, quali i codici restituiti. Gli errori vengono sempre rilevati poiché se viene generata un'eccezione e l'eccezione non viene gestita, il runtime termina l'applicazione. I valori non validi non continuano a propagarsi nel sistema quando il codice non riesce a verificare la presenza di un codice di errore restituito.

Eccezioni comuni

Nella tabella seguente sono elencate alcune eccezioni comuni con esempi di possibili cause.

Tipo di eccezione Descrizione Esempio
Exception Classe base per tutte le eccezioni. Nessuno (usare una classe derivata di questa eccezione).
IndexOutOfRangeException Generata dal runtime solo quando una matrice viene indicizzata in modo non corretto. Indicizzazione di una matrice esternamente al relativo intervallo valido:
arr[arr.Length+1]
NullReferenceException Generata dal runtime solo quando viene fatto riferimento a un oggetto Null. object o = null;
o.ToString();
InvalidOperationException Generata dai metodi con uno stato non valido. Chiamata di Enumerator.MoveNext() dopo la rimozione di un elemento dalla raccolta sottostante.
ArgumentException Classe base per tutte le eccezioni di argomento. Nessuno (usare una classe derivata di questa eccezione).
ArgumentNullException Generata dai metodi che non consentono un argomento Null. String s = null;
"Calculate".IndexOf(s);
ArgumentOutOfRangeException Generata dai metodi che verificano se gli argomenti sono compresi in un determinato intervallo. String s = "string";
s.Substring(s.Length+1);

Vedi anche