Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Obslužná rutina výjimek založená na rámci vám umožňuje řešit možnost, že se výjimka může vyskytnout v určité sadě kódu. Obslužná rutina výjimky založená na rámci se skládá z následujících prvků.
- Chráněný blok kódu
- Výraz filtru
- Blok obslužné rutiny výjimky
Obslužné rutiny výjimek založené na rámcích jsou deklarovány v syntaxi specifické pro jazyk. Například v Microsoft C/C++ Optimalizačním Kompilátoru jsou implementovány pomocí __try a __except. Další informace naleznete v tématu obslužná rutina syntaxe.
Kód chráněný je sada jednoho nebo více příkazů, pro které výraz filtru a blok obslužné rutiny výjimky zajišťují ochranu při zpracování výjimek. Strážené tělo může být blok kódu, sada vnořených bloků nebo celá procedura nebo funkce. Pomocí optimalizačního kompilátoru Microsoft C/C++ je chráněné tělo uzavřeno složenými závorkami ({}) za klíčovým slovem __try.
Výraz filtru obslužné rutiny výjimky založené na rámci je výraz, který systém vyhodnocuje, když dojde k výjimce v chráněném těle. Výsledkem tohoto vyhodnocení je jedna z následujících akcí systému.
- Systém zastaví hledání obslužné rutiny výjimky, obnoví stav počítače a pokračuje ve spuštění vlákna v okamžiku, kdy došlo k výjimce.
- Systém pokračuje v hledání obslužné rutiny výjimky.
- Systém přenese řízení do obslužné rutiny výjimky a provádění vlákna pokračuje postupně v rámci zásobníku, ve kterém je nalezena obslužná rutina výjimky. Pokud obslužná rutina není v rámci zásobníku, ve kterém došlo k výjimce, systém odvíjí zásobník, vynechá aktuální rámec zásobníku a všechny ostatní rámce zásobníku, dokud se nevrátí k rámci zásobníku obslužné rutiny výjimky. Před spuštěním obslužné rutiny výjimky se obslužné rutiny ukončení spustí pro všechna strážená těla kódu, která se ukončila výsledkem přenosu řízení do obslužné rutiny výjimky. Další informace o obsluze ukončení najdete v tématu Obsluha ukončení.
Výraz filtru může být jednoduchý výraz nebo může vyvolat funkci filtru , která se pokusí o zpracování výjimky. Můžete volat funkce GetExceptionCode a GetExceptionInformation z výrazu filtru, abyste získali informace o filtrované výjimce. GetExceptionCode vrátí kód, který identifikuje typ výjimky, a GetExceptionInformation vrátí ukazatel na strukturu EXCEPTION_POINTERS, která obsahuje ukazatele na kontextové a EXCEPTION_RECORD struktury.
Tyto funkce nelze volat z funkce filtru, ale jejich návratové hodnoty lze předat jako parametry do funkce filtru. GetExceptionCode lze použít v rámci bloku obslužné rutiny výjimky, ale GetExceptionInformation nemůže, protože informace, na které odkazuje, jsou obvykle v zásobníku a jsou zničeny při přenosu ovládacího prvku do obslužné rutiny výjimky. Aplikace ale může tyto informace zkopírovat do bezpečného úložiště, aby je měla k dispozici obslužná rutina výjimky.
Výhodou funkce filtru je, že dokáže zpracovat výjimku a vrátit hodnotu, která způsobí, že systém bude pokračovat v provádění od okamžiku, kdy došlo k výjimce. Naopak při použití bloku pro zachytávání výjimek pokračuje provádění postupně od obslužné rutiny výjimky, nikoli od bodu, kde došlo k výjimce.
Zpracování výjimky může být stejně jednoduché jako označení chyby a nastavení příznaku, který se prověří později, tisk upozornění nebo chybové zprávy nebo provedení nějaké jiné omezené akce. Pokud může být provádění pokračovat, může být také nutné změnit stav počítače úpravou kontextového záznamu. Příklad funkce filtru, která zpracovává výjimku selhání stránky, naleznete v tématu Použití funkcí virtuální paměti.
Funkci UnhandledExceptionFilter lze použít jako funkci filtru ve výrazu filtru. Vrátí EXCEPTION_EXECUTE_HANDLER, pokud proces není laděný, v takovém případě vrátí EXCEPTION_CONTINUE_SEARCH.