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:
Chráněná část je spuštěna.
Nedojde-li za běhu chráněné části k žádné výjimce, pokračuje běh programu příkazem za klauzulí
__except
.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é
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro