Gestione delle eccezioni basata su frame

Un gestore 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 sorvegliato di codice
  • Espressione di filtro
  • Blocco del gestore 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 altre informazioni, vedere 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 microsoft C/C++ Ottimizzazione del compilatore, un corpo sorvegliato è 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 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 non si trova nello stack frame in cui si è verificata l'eccezione, il sistema rimuove lo stack, lasciando lo stack frame corrente e qualsiasi altro stack frame finché non torna al frame dello stack del gestore eccezioni. Prima dell'esecuzione di un gestore eccezioni, i gestori di terminazione vengono eseguiti per tutti i corpi sorvegliati del codice che terminano in seguito al trasferimento del controllo al gestore 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 funzioni GetExceptionCode e 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 a CONTEXT e EXCEPTION_RECORD strutture.

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_edizione Standard ARCH.