Zkuste-s výjimkou prohlášení
Konkrétní společnosti Microsoft
Popisuje následující syntaxi try-s výjimkou prohlášení:
__try
{
// guarded code
}
__except ( expression )
{
// exception handler code
}
Poznámky
Akci-s výjimkou prohlášení je rozšíření společnosti Microsoft pro c a C++ jazyků, které umožňuje získat cílové aplikace řízení, pokud dojde k události, které obvykle ukončit provádění programu.Tyto události se nazývají výjimky a mechanismus, který se zabývá výjimky se nazývá structured exception handling.
Související informace naleznete try nakonec prohlášení.
Výjimky mohou být založeny na hardwaru nebo softwaru.I když aplikace nelze obnovit úplně z výjimky hardwaru nebo softwaru, structured exception handling umožňuje zobrazit informace o chybě a soutisk vnitřního stavu aplikace, diagnostikovat problém.To je užitečné pro občasné problémy, které nelze snadno reprodukovat.
[!POZNÁMKA]
Structured exception zpracování spolupracuje s Win32 pro c a C++ zdrojové soubory.Však ji není navržena speciálně pro C++.Můžete zajistit, že kód je obecnější pomocí zpracování výjimek v C++.Zpracování výjimek v jazyce C++ je také pružnější, v tom, že je schopen zpracovat výjimky libovolného typu.C++ programy, je vhodné použít mechanismus zpracování výjimek C++ (akci, zachytit a vyvoláním prohlášení).
Složený příkaz po __try klauzule je subjekt nebo chráněné části.Složený příkaz po __except klauzule je zpracování výjimek.Obslužná rutina určuje sadu akcí, které mají být přijata, pokud se během provádění chráněné části těla je vyvolána výjimka.Spuštění postupuje následovně:
Chráněné části proveden.
Žádná výjimka dojde-li během provádění části chráněné, pokračuje na příkazu po zpracování __except klauzule.
Pokud dojde k výjimce při provádění části chráněné nebo všechny rutinní volá chráněné oblasti, __exceptvýraz (nazývá Filtr výraz) je vyhodnocena a hodnota určuje způsob zpracování výjimku. Existují tři hodnoty:
EXCEPTION_CONTINUE_EXECUTION (–1) je výjimka zamítnuta.Provádění pokračujte v místě, kde došlo k výjimce.
EXCEPTION_CONTINUE_SEARCH (0) výjimka nebyla rozpoznána.Pokračovat v hledání až zásobníku pro obsluhu, nejprve obsahující akci-s výjimkou příkazy, pak s nejvyšší prioritou další obsluhy.
EXCEPTION_EXECUTE_HANDLER (1) je rozpoznána výjimka.Převod řízení do zpracování výjimek provedením __except složený příkaz a potom pokračovat po spuštění __except bloku.
Protože __s výjimkou výraz vyhodnocen jako výraz C, je omezen na jednu hodnotu, podmíněný výraz operátor nebo operátor čárka.Pokud je požadováno rozsáhlejší zpracování, můžete výraz volání rutiny, která vrací jednu ze tří hodnot uvedených výše.
Každá aplikace může mít svůj vlastní zpracování výjimek.
Není platný přejít do __try prohlášení, ale platné přecházet z jednoho.Nebyla volána popisovač výjimky, pokud je proces ukončen uprostřed provádění akci-s výjimkou prohlášení.
Další informace naleznete v článku znalostní báze Knowledge Base Q315937: jak: přesahů přetečení zásobníku aplikace Visual C++.
Klíčové slovo __leave
__leave Klíčové slovo je platná pouze v rámci chráněné části try-except prohlášení a jeho vliv je přejít na konec chráněné oblasti.Spuštění pokračuje na prvním příkazem po zpracování výjimek.
A goto prohlášení můžete také přejít z chráněné části a se nesnižuje výkon jako try-finally prohlášení protože příkazem zásobníku nedochází.Doporučujeme však používat __leave klíčové slovo, nikoli goto prohlášení protože méně pravděpodobné, že uděláte programování chráněné oddíl je velké nebo složité.
Strukturované vnitřní funkce zpracování výjimek
Structured exception handling poskytuje dvě vnitřní funkce, které jsou k dispozici pro použití se akci-s výjimkou prohlášení: GetExceptionCode a GetExceptionInformation.
GetExceptionCode vrátí kód výjimky (32bitové celé číslo).
Vnitřní funkce GetExceptionInformation vrací ukazatel na strukturu obsahující další informace o výjimce.Pomocí tohoto ukazatele můžete přistupovat stavu počítače v době hardwarové výjimky.Struktura je takto:
struct _EXCEPTION_POINTERS {
EXCEPTION_RECORD *ExceptionRecord,
CONTEXT *ContextRecord }
Ukazatel typy _EXCEPTION_RECORD akontextu jsou definovány v souboru zahrnout vyjma.H.
Můžete použít GetExceptionCode v rámci zpracování výjimek.Můžete však použít GetExceptionInformation pouze v rámci výrazu filtru výjimky.Informace, které se odkazuje v zásobníku je obecně a již není k dispozici při řízení přenosu na zpracování výjimek.
Vnitřní funkce AbnormalTermination je k dispozici v rámci ukončení rutiny.Vrátí 0, pokud text try-finally příkaz ukončí postupně.V ostatních případech vrátí 1.
VYJMA.H definuje některé alternativní názvy pro tyto vnitřní objekty serveru:
GetExceptionCode se rovná _exception_code
GetExceptionInformation se rovná _exception_info
AbnormalTermination se rovná _abnormal_termination
Příklad
// exceptions_try_except_Statement.cpp
// Example of try-except and try-finally statements
#include <stdio.h>
#include <windows.h> // for EXCEPTION_ACCESS_VIOLATION
#include <excpt.h>
int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep) {
puts("in filter.");
if (code == EXCEPTION_ACCESS_VIOLATION) {
puts("caught AV as expected.");
return EXCEPTION_EXECUTE_HANDLER;
}
else {
puts("didn't catch AV, unexpected.");
return EXCEPTION_CONTINUE_SEARCH;
};
}
int main()
{
int* p = 0x00000000; // pointer to NULL
puts("hello");
__try{
puts("in try");
__try{
puts("in try");
*p = 13; // causes an access violation exception;
}__finally{
puts("in finally. termination: ");
puts(AbnormalTermination() ? " \tabnormal" : "\tnormal");
}
}__except(filter(GetExceptionCode(), GetExceptionInformation())){
puts("in except");
}
puts("world");
}
Výsledek
hello
in try
in try
in filter.
caught AV as expected.
in finally. termination:
abnormal
in except
world
Konec konkrétní společnosti Microsoft