Condividi tramite


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 )

Vedere anche

Riferimenti

Scrittura di un gestore eccezioni

Gestione delle eccezioni strutturata (C++)