Udostępnij za pośrednictwem


Zapisywania filtru wyjątków

Przeskakuje do poziomu obsługi wyjątków lub poprzez dalsze wykonanie, może obsłużyć wyjątek.Zamiast kodu procedury obsługi wyjątku do obsługi wyjątków i objętych można używać filtru do oczyścić problem, a następnie, przez zwrócenie –1, Wznowienie normalnego przepływu, bez czyszczenia stosu.

[!UWAGA]

Niektóre wyjątki nie może być kontynuowane.Jeśli filtru wynikiem do –1 takiego wyjątku, system wzbudzi nowy wyjątek.Gdy wywołanie RaiseException, można określić, czy wyjątek będzie w dalszym ciągu.

Na przykład, następujący kod używa funkcji wywołania w filtru wyrażenie: Ta funkcja obsługuje ten problem, a następnie zwraca –1 Wznowienie normalnego przepływu sterowania:

// 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;
}

Zaleca się używać wywołania funkcji w filtru wyrażenie zawsze, gdy filtru musi robić nic złożonych.Oceny wyrażenie powoduje wykonanie funkcji, w tym przypadku Eval_Exception.

Uwaga Użycie GetExceptionCode do określenia wyjątek.Trzeba wywołać tę funkcję, wewnątrz sam filtr.Eval_Exceptionnie można wywołać elementu GetExceptionCode, ale musi mieć do niej przekazany kod wyjątku.

Ten program obsługi przekazuje sterowanie do innego programu obsługi, chyba że wyjątek jest liczbą całkowitą lub nadmiar zmiennoprzecinkowy.Jeśli jest, program obsługi wywołuje funkcję (ResetVars jest tylko przykładem, nie funkcji interfejsu API) aby zresetować niektóre zmienne globalne.Instrukcja block-2, które w tym przykładzie jest puste, można nigdy nie można wykonać, ponieważ Eval_Exception nigdy nie zwraca EXCEPTION_EXECUTE_HANDLER (1).

Wywołanie funkcji jest dobra ogólnego przeznaczenia techniką za zajmowanie się złożonych wyrażeniach filtrów.Dwie inne funkcje języka C, które są przydatne są:

  • Operator warunkowy

  • Operator przecinek

Operator warunkowy jest często bardzo użyteczne, ponieważ używany do sprawdzania dla określonego kodu powrotu i zwracany jest jedną z dwóch różnych wartości.Na przykład filtr w poniższym kodzie rozpoznaje wyjątek tylko wtedy, gdy wyjątek jest STATUS_INTEGER_OVERFLOW:

__except( GetExceptionCode() == STATUS_INTEGER_OVERFLOW ? 1 : 0 ) {

Celem operator warunkowy w tym przypadku jest głównie do zapewnienia przejrzystości, ponieważ poniższy kod generuje te same wyniki:

__except( GetExceptionCode() == STATUS_INTEGER_OVERFLOW ) {

Operator warunkowy jest bardziej użyteczne w sytuacjach, w których może zajść filtr do oceny na –1, EXCEPTION_CONTINUE_EXECUTION.

Operator przecinek umożliwia wykonywanie wielu niezależnych działań wewnątrz pojedynczego wyrażenia.Efekt jest grubsza wykonywanie wielu instrukcji, a następnie zwracają wartość ostatniego wyrażenia.Na przykład poniższy kod przechowuje kod wyjątku w zmiennej i testuje on:

__except( nCode = GetExceptionCode(), nCode == STATUS_INTEGER_OVERFLOW )

Zobacz też

Informacje

Pisanie procedury obsługi wyjątków

Strukturalnej obsługi (C++) wyjątków