Condividi tramite


Gestione delle eccezioni basata su frame

Un gestore di eccezioni basato su frame consente di gestire la possibilità che si verifichi un'eccezione in una determinata sequenza di codice. Un gestore eccezioni basato su frame è costituito dagli elementi seguenti.

  • Corpo protetto di codice
  • Espressione di filtro
  • Blocco per la gestione delle eccezioni

I gestori eccezioni basati su frame vengono dichiarati nella sintassi specifica del linguaggio. Ad esempio, nell'ottimizzazione del compilatore Microsoft C/C++ vengono implementati usando __try e __except. Per ulteriori informazioni, consultare la sintassi del gestore .

Il corpo sorvegliato del codice è un set di una o più istruzioni per le quali l'espressione di filtro e il blocco del gestore eccezioni forniscono protezione per la gestione delle eccezioni. Il corpo sorvegliato può essere un blocco di codice, un set di blocchi annidati o un'intera routine o funzione. Usando il compilatore di ottimizzazione Microsoft C/C++, un blocco di codice protetto è racchiuso tra parentesi graffe ({}) dopo la parola chiave __try.

L'espressione di filtro di un gestore eccezioni basato su frame è un'espressione valutata dal sistema quando si verifica un'eccezione all'interno del corpo sorvegliato. Questa valutazione comporta una delle azioni seguenti da parte del sistema.

  • Il sistema arresta la ricerca di un gestore eccezioni, ripristina lo stato della macchina e continua l'esecuzione del thread nel punto in cui si è verificata l'eccezione.
  • Il sistema continua la ricerca di un gestore di eccezioni.
  • Il sistema trasferisce il controllo al gestore eccezioni e l'esecuzione del thread continua in sequenza nello stack frame in cui viene trovato il gestore eccezioni. Se il gestore dell'eccezione non si trova nello stack frame in cui si è verificata l'eccezione, il sistema disfa lo stack, lasciando il frame corrente e qualsiasi altro frame finché non ritorna al frame del gestore dell'eccezione. Prima dell'esecuzione di un gestore delle eccezioni, i gestori di terminazione vengono eseguiti per tutti i corpi sorvegliati del codice che sono terminati a seguito del trasferimento del controllo al gestore delle eccezioni. Per altre informazioni sui gestori di terminazione, vedere Gestione della terminazione.

L'espressione di filtro può essere un'espressione semplice oppure può richiamare una funzione di filtro che tenta di gestire l'eccezione. Puoi chiamare le funzioniGetExceptionCodee GetExceptionInformation dall'interno di un'espressione di filtro per ottenere informazioni sull'eccezione filtrata. GetExceptionCode restituisce un codice che identifica il tipo di eccezione e GetExceptionInformation restituisce un puntatore a una struttura EXCEPTION_POINTERS che contiene puntatori alle strutture di CONTEXT e EXCEPTION_RECORD.

Queste funzioni non possono essere chiamate dall'interno di una funzione di filtro, ma i valori restituiti possono essere passati come parametri a una funzione di filtro. GetExceptionCode può essere usato all'interno del blocco del gestore eccezioni, ma GetExceptionInformation non può perché le informazioni a cui punta si trova in genere nello stack e vengono eliminate definitivamente quando il controllo viene trasferito a un gestore eccezioni. Tuttavia, un'applicazione può copiare le informazioni in una risorsa di archiviazione sicura per renderla disponibile per il gestore eccezioni.

Il vantaggio di una funzione di filtro è che può gestire un'eccezione e restituire un valore che fa sì che il sistema continui l'esecuzione dal punto in cui si è verificata l'eccezione. Con un blocco del gestore eccezioni, al contrario, l'esecuzione continua in sequenza dal gestore eccezioni anziché dal punto dell'eccezione.

La gestione di un'eccezione può essere semplice come la notazione di un errore e l'impostazione di un flag che verrà esaminato in un secondo momento, la stampa di un avviso o un messaggio di errore o l'esecuzione di altre azioni limitate. Se l'esecuzione può essere continuata, potrebbe anche essere necessario modificare lo stato della macchina modificando il record di contesto. Per un esempio di funzione di filtro che gestisce un'eccezione di errore di pagina, vedere Uso delle funzioni di memoria virtuale.

La funzione UnhandledExceptionFilter può essere usata come funzione di filtro in un'espressione di filtro. Restituisce EXCEPTION_EXECUTE_HANDLER a meno che il processo non venga sottoposto a debug, nel qual caso restituisce EXCEPTION_CONTINUE_SEARCH.