Syntaxe Exception-Handler
Klíčová slova __try a __except slouží k vytvoření obslužné rutiny výjimky založené na rámci. Následující příklad ukazuje strukturu obslužné rutiny výjimky.
__try
{
// guarded body of code
}
__except (filter-expression)
{
// exception-handler block
}
Všimněte si, že blok __try a blok obslužné rutiny výjimky vyžadují složené závorky ({}). Použití příkazu goto pro přechod do textu bloku __try nebo do bloku obslužné rutiny výjimky není povoleno. Toto pravidlo platí pro obslužné rutiny výjimek i obslužné rutiny ukončení.
Blok __try obsahuje strážené tělo kódu, které obslužná rutina výjimky chrání. Funkce může mít libovolný počet obslužných rutin výjimek a tyto příkazy zpracování výjimek můžou být vnořené do stejné funkce nebo v různých funkcích. Pokud dojde k výjimce v rámci __try bloku, systém převezme řízení a zahájí hledání obslužné rutiny výjimky. Podrobný popis tohoto vyhledávání najdete v tématu Zpracování výjimek.
Obslužná rutina výjimky přijímá pouze výjimky, ke kterým dochází v jednom vlákně. To znamená, že pokud blok __try obsahuje volání CreateProcess nebo CreateThread funkce, výjimky, ke kterým dochází v rámci nového procesu nebo vlákna, se do této obslužné rutiny neodesílají.
Systém vyhodnocuje výraz filtru každé obslužné rutiny výjimky, která chrání kód, ve kterém došlo k výjimce, dokud se nezpracuje výjimka, nebo neexistují žádné další obslužné rutiny. Výraz filtru musí být vyhodnocen jako jedna ze tří následujících hodnot.
Hodnota | Význam |
---|---|
EXCEPTION_EXECUTE_HANDLER | Systém přenese řízení na obslužnou rutinu výjimky a provádění pokračuje v rámci zásobníku, ve kterém je nalezena obslužná rutina. |
EXCEPTION_CONTINUE_SEARCH | Systém pokračuje v hledání obslužné rutiny. |
EXCEPTION_CONTINUE_EXECUTION | Systém zastaví hledání obslužné rutiny a vrátí řízení do bodu, kdy došlo k výjimce. Pokud je výjimka nedostupná, výsledkem je EXCEPTION_NONCONTINUABLE_EXCEPTION výjimka. |
Výraz filtru se vyhodnocuje v kontextu funkce, ve které se nachází obslužná rutina výjimky, i když k výjimce mohlo dojít v jiné funkci. To znamená, že výraz filtru má přístup k místním proměnným funkce. Podobně může blok obslužné rutiny výjimky přistupovat k místním proměnným funkce, ve které se nachází.
Další příklady najdete v tématu Použití obslužné rutiny výjimky.
Další informace o výrazech filtru a funkcích filtru najdete v tématu Zpracování výjimek založených na frame.