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 )