Scrittura di un filtro eccezioni
È possibile gestire un'eccezione passando al livello del gestore eccezioni o per l'esecuzione.Anziché utilizzare il codice di gestione delle eccezioni per gestire l'eccezione e dell'esecuzione del fallback tramite, è possibile utilizzare filtro per pulire il problema quindi, restituendo - 1, riattivare il flusso normale senza cancellare lo stack.
[!NOTA]
Alcune eccezioni non è possibile continuare.se filtro valuta e 1 per tale eccezione, salti di sistema una nuova eccezione.Quando si chiama RaiseException, determinare se l'eccezione continuerà.
Ad esempio, il codice seguente viene utilizzata una chiamata di funzione in filtro espressione: questa funzione gestisce il problema e quindi restituisce e 1 per riprendere il flusso di controllo normale:
// exceptions_Writing_an_Exception_Filter.cpp
#include <windows.h>
int main() {
int Eval_Exception( int );
__try {}
__except ( Eval_Exception( GetExceptionCode( ))) {
;
}
}
void ResetVars( int ) {}
int Eval_Exception ( int n_except ) {
if ( n_except != STATUS_INTEGER_OVERFLOW &&
n_except != STATUS_FLOAT_OVERFLOW ) // Pass on most exceptions
return EXCEPTION_CONTINUE_SEARCH;
// Execute some code to clean up problem
ResetVars( 0 ); // initializes data to 0
return EXCEPTION_CONTINUE_EXECUTION;
}
È consigliabile utilizzare una chiamata di funzione in filtro espressione ogni qualvolta filtro necessità di effettuare operazioni complesse.La valutazione di un'espressione causa l'esecuzione della funzione, in questo caso, Eval_Exception.
Si noti l'utilizzo di GetExceptionCode per determinare l'eccezione.È necessario chiamare questa funzione nel filtro stessa.Eval_Exception non è possibile chiamare GetExceptionCode, ma deve avere il codice dell'eccezione passato.
Questo gestore passa il controllo a un altro gestore a meno che l'eccezione è un Integer o un overflow a virgola mobile.se è, il gestore chiama una funzione (ResetVars è solo un esempio, non una funzione API) per reimpostare le variabili globali.Statement-block-2, che in questo esempio è vuoto, non può essere eseguito mai perché Eval_Exception non restituisce mai EXCEPTION_EXECUTE_HANDLER (1).
Utilizzo di una chiamata di funzione tratta di una tecnica efficace di utilizzo generale per gestire le espressioni di filtro complesse.Altre due funzionalità del linguaggio C utili sono:
l'operatore condizionale
L'operatore virgola
L'operatore condizionale è spesso utile, poiché può essere utilizzato per verificare la presenza di un codice restituito specifico e quindi per restituire uno di due valori diversi.Ad esempio, il filtro nel codice seguente riconosce l'eccezione solo se l'eccezione viene STATUS_INTEGER_OVERFLOW:
__except( GetExceptionCode() == STATUS_INTEGER_OVERFLOW ? 1 : 0 ) {
Lo scopo dell'operatore condizionale in questo caso è principalmente di fornire la chiarezza, poiché il codice riportato di seguito fornisce gli stessi risultati:
__except( GetExceptionCode() == STATUS_INTEGER_OVERFLOW ) {
L'operatore condizionale è molto utile nelle situazioni in cui è possibile il filtro per valutare e 1, EXCEPTION_CONTINUE_EXECUTION.
L'operatore virgola consente di eseguire più DSP, operazioni indipendenti in un'unica espressione.L'effetto è approssimativamente quello di eseguire più istruzioni e quindi di restituire il valore dell'ultima espressione.Ad esempio, il codice seguente consente di archiviare il codice dell'eccezione in una variabile e lo si verifica l'evento:
__except( nCode = GetExceptionCode(), nCode == STATUS_INTEGER_OVERFLOW )