Share via


try-except – příkaz (C)

specifické pro společnost Microsoft

Příkaz try-except je rozšíření jazyka C od Microsoftu, které umožňuje aplikacím získat kontrolu nad programem, když dojde k událostem, které obvykle ukončují provádění. Tyto události jsou nazývány výjimkami a mechanismus, který se výjimkami zabývá, se nazývá strukturované zpracování výjimek.

Výjimky můžou být hardwarové nebo softwarové. I když se aplikace z hardwarových nebo softwarových výjimek nemůžou úplně zotavit, strukturované zpracování výjimek umožňuje protokolovat a zobrazovat informace o chybách. Při diagnostice problému je užitečné zachytit interní stav aplikace. Zejména je to užitečné pro občasné problémy, které se nesnadně reprodukují.

Syntax

try-except-statement:
__try compound-statement __except ( expression ) compound-statement

Složený příkaz za klauzulí __try je strážený oddíl. Složený příkaz za klauzulí __except je obslužnou rutinou výjimky. Obslužná rutina určuje sadu akcí, které se mají provést, pokud je během provádění strážené části vyvolána výjimka. Provádění probíhá takto:

  1. Chráněná část je spuštěna.

  2. Nedojde-li za běhu chráněné části k žádné výjimce, pokračuje běh programu příkazem za klauzulí __except.

  3. Pokud dojde k výjimce během provádění stráženého oddílu nebo v jakékoli rutině, která strážený oddíl volá, __except výraz se vyhodnotí. Vrácená hodnota určuje způsob zpracování výjimky. Existují tři možné hodnoty:

    • EXCEPTION_CONTINUE_SEARCH: Výjimka se nerozpoznala. Pokračujte hledáním obslužné rutiny v zásobníku, nejprve pro obsahující try-except příkazy a pak pro obslužné rutiny s další nejvyšší prioritou.

    • EXCEPTION_CONTINUE_EXECUTION: Výjimka se rozpozná, ale zavře. Program bude pokračovat tam, kde k výjimce došlo.

    • EXCEPTION_EXECUTE_HANDLER Výjimka se rozpozná. Přeneste řízení do obslužné rutiny výjimky spuštěním složeného __except příkazu a pak pokračujte v provádění v okamžiku, kdy došlo k výjimce.

Vzhledem k tomu, že výraz __except je vyhodnocen jako výraz jazyka C, je omezen na jednu hodnotu, operátor podmíněného výrazu nebo operátor čárky. Je-li požadováno rozsáhlejší zpracování, může výraz zavolat rutinu, která vrátí jednu z výše uvedených tří hodnot.

Poznámka

Strukturované zpracování výjimek funguje se zdrojovými soubory C a C++. Není ale speciálně navržený pro C++. U přenosných programů C++ by se místo strukturovaného zpracování výjimek mělo používat zpracování výjimek jazyka C++. Mechanismus zpracování výjimek jazyka C++ je také mnohem flexibilnější, protože dokáže zpracovávat výjimky libovolného typu. Další informace najdete v tématu Zpracování výjimek v referenční dokumentaci jazyka C++.

Každá rutina v aplikaci může mít vlastní obslužnou rutinu výjimky. Výraz se __except spustí v oboru __try textu. Má přístup ke všem místním proměnným, které jsou zde deklarovány.

Klíčové __leave slovo je platné v bloku try-except příkazů. Výsledkem __leave je přeskočení na konec try-except bloku. Provádění se obnoví po ukončení obslužné rutiny výjimky. goto I když příkaz lze použít k dosažení stejného výsledkugoto, příkaz způsobí uvolnění zásobníku. Příkaz __leave je efektivnější, protože nezahrnuje odvíjení zásobníku.

try-except Ukončení příkazu pomocí longjmp funkce run-time se považuje za neobvyklé ukončení. Není legální skočit do __try prohlášení, ale je legální z něj vyskočit. Obslužná rutina výjimky se nevolá, pokud se proces ukončí uprostřed provádění try-except příkazu.

Příklad

Tady je příklad obslužné rutiny výjimky a obslužné rutiny ukončení. Další informace o obslužných rutinách ukončení najdete v tématu try-finally příkaz (C).

.
.
.
puts("hello");
__try {
   puts("in try");
   __try {
      puts("in try");
      RAISE_AN_EXCEPTION();
   } __finally {
      puts("in finally");
   }
} __except( puts("in filter"), EXCEPTION_EXECUTE_HANDLER ) {
   puts("in except");
}
puts("world");

Tady je výstup z příkladu s komentářem vpravo:

hello
in try              /* fall into try                        */
in try              /* fall into nested try                 */
in filter           /* execute filter; returns 1 so accept  */
in finally          /* unwind nested finally                */
in except           /* transfer control to selected handler */
world               /* flow out of handler                  */

KONEC specifického pro Microsoft

Viz také

try-except příkaz (C++)