Sdílet prostřednictvím


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ě:

  1. Chráněné části proveden.

  2. Žádná výjimka dojde-li během provádění části chráněné, pokračuje na příkazu po zpracování __except klauzule.

  3. 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é.

s58ftw19.collapse_all(cs-cz,VS.110).gifStrukturované 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

Viz také

Referenční dokumentace

Psaní popisovač výjimky

Structured Exception zpracování (C++)

Klíčových slov jazyka C++