Sdílet prostřednictvím


Psaní výjimkou filtru

Výjimku lze zpracovat přechod na úroveň zpracování výjimek nebo pokračováním spuštění.Namísto zpracování kód výjimky zpracovat výjimku a pádu použít Filtr a vyčistit problém a pak vrácením –1 obnovit normální tok bez vymazání zásobníku.

[!POZNÁMKA]

Některé výjimky nelze pokračovat.Pokud Filtr vyhodnotí na –1 takové výjimky systému vyvolává nové výjimky.Při volání RaiseException, určit, zda bude pokračovat výjimku.

Například následující kód používá volání funkce Filtr výraz: Tato funkce zpracovává problém a vrátí –1 obnovit normální tok řízení:

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

Je vhodné použít volání funkce v Filtr výrazu při každém Filtr třeba provádět složité.Vyhodnocení výrazu způsobí spuštění funkce, v tomto případě Eval_Exception.

Poznámka: použití GetExceptionCode určit výjimky.Tato funkce uvnitř samotného filtru je třeba volat.Eval_Exceptionnelze volat GetExceptionCode, ale musí do ní kód výjimky.

Toto zpracování předá řízení jiného popisovače Pokud výjimka není celé číslo nebo přetečení v pohyblivé čárce.Pokud je popisovač volání funkce (ResetVars je pouze příklad, není funkce rozhraní API) obnovit některé globální proměnné.Prohlášení blok 2, která v tomto příkladu je prázdné, můžete nikdy provést, protože Eval_Exception nikdy vrátí EXCEPTION_EXECUTE_HANDLER (1).

Pomocí volání funkce je dobré obecný postup pro řešení složitých výrazů.Dva další funkce jazyka C, které jsou užitečné jsou:

  • Podmínečný operátor

  • Operátor čárka

Podmínečný operátor je často užitečné, protože používá kontrolu konkrétní návratový kód a potom vrátit jeden ze dvou různých hodnot.Například filtr v následujícím kódu rozpozná výjimku pouze v případě, že výjimka je STATUS_INTEGER_OVERFLOW:

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

Účelem Podmínečný operátor v tomto případě je především poskytnout jasnosti, protože následující kód vytvoří stejné výsledky:

__except( GetExceptionCode() == STATUS_INTEGER_OVERFLOW ) {

Podmínečný operátor je užitečnější v situacích, kdy může být vyhodnoceny –1, EXCEPTION_CONTINUE_EXECUTION filtr.

Operátor čárka umožňuje provádět více nezávislých operací uvnitř jeden výraz.Efekt je zhruba spuštění více příkazů a vrácením hodnoty poslední výrazu.Například následující kód uloží kód výjimky v proměnné a potom otestuje:

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

Viz také

Referenční dokumentace

Psaní popisovač výjimky

Structured Exception zpracování (C++)