Sdílet prostřednictvím


try-finally – příkaz

Specifické pro produkty společnosti Microsoft

Následující syntaxe popisuje příkaz try-finally:

__try {
   // guarded code
}
__finally {
   // termination code
}

Gramatika

  • příkaz-try-finally:
    __try složený příkaz

    __finally složený příkaz

Příkaz try-finally je rozšíření jazyků C a C++ společnosti Microsoft umožňující cílovým aplikacím zajistit spuštění kódu pro vyčištění při přerušení provádění bloku kódu.Vyčištění obsahuje úkoly, jako je zrušení přidělení paměti, uzavření souborů a uvolnění popisovačů souborů.Příkaz try-finally je obzvláště užitečný pro rutiny, které mají několik míst, kde je provedena kontrola chyby, která by mohla způsobit předčasné vrácení z této rutiny.

Související informace a příklad kódu naleznete v tématu Příkaz try-except.Další informace o obecném zpracování strukturovaných výjimek naleznete v tématu Strukturované zpracování výjimek.Další informace o zpracování výjimek ve spravovaných aplikacích naleznete v tématu Zpracování výjimek v rámci možnosti /clr.

[!POZNÁMKA]

Strukturované zpracování výjimek funguje na architektuře Win32 pro zdrojové soubory jazyka C i C++.Pro jazyk C++ však není výslovně navržen.Větší přenositelnost kódu lze zajistit použitím zpracování výjimek jazyka C++.Zpracování výjimek jazyka C++ je také více flexibilní, jelikož dokáže zpracovat výjimky libovolného typu.Pro programy C++ je doporučeno použití mechanismu zpracování výjimek jazyka C++ (příkazy try, catch a throw).

Složený příkaz za klauzulí __try je chráněná část.Složený příkaz po klauzuli __finally je obslužnou rutinou ukončení.Obslužná rutina určuje sadu akcí, které jsou provedeny při opuštění chráněné části bez ohledu na to, zda je chráněná část ukončena výjimkou (abnormální ukončení) nebo standardním předáním řízení (normální ukončení).

Řízení dosáhne příkazu __try jednoduchých sekvenčním prováděním (předáním řízení).Když řízení vstoupí do bloku __try, stanou se jeho přidružené obslužné rutiny aktivní.Pokud tok řízení dosáhne konce bloku try, probíhá spuštění následujícím způsobem:

  1. Je vyvolána rutina ukončení.

  2. Po dokončení obslužné rutiny ukončení provádění pokračuje za příkazem __finally.Bez ohledu na to, jakým způsobem chráněný oddíl skončí (například prostřednictvím příkazu goto nebo příkazu return), je obslužná rutina ukončení spuštěna před (before) tím, než se tok řízení dostane mimo chráněnou oblast.

    Příkaz __finally neblokuje hledání příslušné obslužné rutiny výjimky.

Pokud v bloku __try dojde k výjimce, operační systém musí najít obslužnou rutinu výjimky nebo program selže.Pokud je obslužná rutina nalezena, jsou spuštěny všechny bloky __finally a provádění pokračuje v této obslužné rutině.

Předpokládejme například, že série volání funkcí propojí funkci A s funkcí D, jak je znázorněno na následujícím obrázku.Každá funkce má jednu obslužnou rutinu ukončení.Pokud je výjimka vyvolána ve funkci D a obsloužena ve funkci A, obslužné rutiny ukončení jsou zavolány v pořadí jakým systém uvolňuje zásobník: D, C, B.

Pořadí provádění obslužných rutin ukončení

Pořadí zpracování obslužné rutiny ukončení

[!POZNÁMKA]

Chování příkazu try-finally se liší od jiných jazyků, které podporují použití bloku finally, jako je jazyk C#. Jeden blok __try může mít jeden z bloků __finally nebo __except, ale nikoli obojí. Pokud jsou oba bloky použity společně, musí být vnitřní příkaz try-finally uzavřen ve vnějším příkazu try-except. Pravidla určující, kdy se každý blok provede, se také liší.

Klíčové slovo __leave

Klíčové slovo __leave je platné pouze uvnitř chráněné části příkazu try-finally a jeho účinkem je přechod na konec chráněné části.Provádění pokračuje prvním příkazem v obslužné rutině ukončení.

Příkaz goto může také přejít mimo chráněnou oblast, ale to snižuje výkon, protože vyvolá odvíjení zásobníku.Příkaz __leave je efektivnější, protože nezpůsobuje odvíjení zásobníku.

Abnormální ukončení

Ukončení příkazu try-finally pomocí funkce longjmp modulu runtime je považováno za abnormální ukončení.Není povoleno přejít do příkazu __try, ale je možné z takového příkazu vyskočit.Všechny příkazy __finally, které jsou aktivní mezi místem zahájení (normální ukončení bloku __try) a cílem (blok __except, který zpracovává výjimky) musí být spuštěny.Toto se nazývá místní odvíjení.

Pokud je blok try ukončen z jakéhokoli důvodu předčasně, včetně skoku mimo blok, systém provede přidružený blok finally jako součást procesu odvíjení zásobníku.V takových případech funkce AbnormalTermination vrátí hodnotu TRUE, pokud je volána zevnitř bloku finally, v opačném případě vrátí hodnotu FALSE.

Obslužná rutina ukončení není zavolána, pokud je proces během provádění příkazu try-finally ukončen.

Specifické pro produkty společnosti Microsoft - konec

Viz také

Referenční dokumentace

Zápis obslužné rutiny ukončení

Strukturované zpracování výjimek (C/C++)

Klíčová slova jazyka C++

Termination-Handler Syntax