Cenni preliminari sulle eccezioni

Aggiornamento: novembre 2007

Un'eccezione è una condizione di errore o un comportamento imprevisto riscontrato da un programma in esecuzione. Vengono generate eccezioni in caso di errori nel codice dell'applicazione o nel codice chiamato (ad esempio, in una libreria condivisa), in caso di risorse del sistema operativo non disponibili, di condizioni impreviste riscontrate in Common Language Runtime (quale la presenza di codice impossibile da verificare) e così via. All'interno di un'applicazione alcune di queste condizioni possono essere superate, ma altre no. Mentre il recupero è possibile con la maggior parte delle eccezioni delle applicazioni, non è possibile con la maggior parte delle eccezioni del runtime.

In .NET Framework le eccezioni sono oggetti che ereditano dalla classe 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é viene gestita dall'applicazione o si arresta il programma. Per ulteriori informazioni sulla gestione di eccezioni tramite .NET Framework, vedere l'argomento Classe Exception.

Modalità di gestione delle eccezioni nel runtime

Nel runtime viene utilizzato un modello di gestione delle eccezioni basato su oggetti eccezione e blocchi di codice protetti. Quando si verifica un'eccezione viene creato un oggetto Exception per rappresentarla.

Nel runtime viene creata, per ciascun eseguibile, una tabella contenente informazioni sulle eccezioni. A ogni metodo dell'eseguibile è associata, nella tabella di informazioni sulle eccezioni, una matrice contenente informazioni sulla gestione delle eccezioni stesse, che può essere vuota. Ciascuna voce della matrice descrive un blocco di codice protetto, eventuali filtri di eccezioni associati a tale codice nonché eventuali gestori eccezioni (istruzioni catch). Questa tabella delle eccezioni è estremamente efficiente e, finché non si verifica alcuna eccezione, non compromette in alcun modo le prestazioni, né in termini di tempo del processore né in termini di utilizzo della memoria. Le risorse vengono utilizzate solo quando ha luogo un'eccezione.

La tabella di informazioni sulle eccezioni rappresenta quattro tipi di gestori eccezioni per blocchi protetti:

  • Un gestore finally che viene eseguito ogni volta che l'elaborazione del blocco si interrompe, sia che questo si verifichi per un normale flusso del controllo o in seguito a un'eccezione non gestita.

  • Un gestore fault che viene eseguito se si verifica un'eccezione, ma non al completamento del normale flusso del controllo.

  • Un gestore filtrato in base al tipo che gestisce tutte le eccezioni di una classe specificata o delle relative classi derivate.

  • Un gestore filtrato dall'utente che esegue codice specificato dall'utente per determinare se l'eccezione debba essere gestita dal gestore associato o passata al blocco protetto successivo.

In ciascun linguaggio questi gestori eccezioni vengono implementati in base alle specifiche in esso definite. In Visual Basic 2005, ad esempio, l'accesso al gestore filtrato dall'utente è consentito tramite un confronto tra variabili (mediante la parola chiave When) nell'istruzione catch, mentre in C# il gestore filtrato dall'utente non viene implementato.

Quando si verifica un'eccezione, nel runtime ha inizio un processo suddiviso in due fasi:

  1. Viene cercato nella matrice il primo blocco protetto che risponde alle seguenti caratteristiche:

    • Protegge una regione che include l'istruzione in corso di esecuzione.

    • Contiene un gestore eccezioni oppure un filtro che gestisce l'eccezione.

  2. Se è presente un blocco che soddisfa queste condizioni, viene creato un oggetto Exception che descrive l'eccezione. Vengono quindi eseguite tutte le istruzioni finally o fault presenti tra l'istruzione in cui si è verificata l'eccezione e l'istruzione che gestisce tale eccezione. Si noti che l'ordine dei gestori eccezioni è importante: il gestore eccezioni più interno viene infatti valutato per primo. Si noti inoltre che i gestori eccezioni sono in grado di accedere alle variabili locali e alla memoria locale della routine che intercetta l'eccezione, ma vanno persi gli eventuali valori dei livelli intermedi dello stack presenti al momento della generazione dell'eccezione.

    Se nel metodo corrente non è disponibile alcun blocco che soddisfa le condizioni indicate, la ricerca verrà effettuata in ciascun chiamante del metodo corrente, risalendo via via, in questo modo, i vari livelli dello stack. Se anche la ricerca effettuata tra i chiamanti ha esito negativo, verrà consentito al debugger di accedere all'eccezione. Se il debugger non è associabile all'eccezione, verrà generato l'evento UnhandledException. Se non è presente alcun listener per l'evento UnhandledException, nel runtime verrà scaricata un'analisi dello stack e il programma verrà terminato.

Filtro delle eccezioni del runtime

È possibile filtrare le eccezioni intercettate e gestite in base al tipo o ad altri criteri definiti dall'utente.

I gestori filtrati in base al tipo gestiscono un tipo particolare di eccezione o le classi da esso derivate. Solitamente si usa il gestore eccezioni filtrato in base al tipo per specificare che dev'essere intercettata solo una particolare classe di eccezioni.

Nell'esempio che segue viene illustrato un gestore di eccezioni progettato per l'intercettazione di un'eccezione specifica, in questo caso FileNotFoundException.

Catch e As FileNotFoundException
   Console.WriteLine("[Data File Missing] {0}", e)
catch(FileNotFoundException e) {
    Console.WriteLine("[Data File Missing] {0}", e);
}

I gestori eccezioni filtrati dall'utente intercettano e gestiscono le eccezioni in base a requisiti definiti dall'utente per le singole eccezioni. In Visual Basic 2005 tali gestori utilizzano l'istruzione Catch con la parola chiave When. Per informazioni dettagliate su questa modalità di filtro delle eccezioni, vedere Utilizzo di eccezioni specifiche in un blocco catch.

Vedere anche

Concetti

Classe e proprietà dell'eccezione

Gerarchia delle eccezioni

Suggerimenti per gestire le eccezioni

Altre risorse

Nozioni fondamentali sulla gestione delle eccezioni

Gestione e generazione di eccezioni