Syntaxe Termination-Handler
Klíčová slova __try a __finally slouží k vytvoření obslužné rutiny ukončení. Následující příklad ukazuje strukturu obslužné rutiny ukončení.
__try
{
// guarded body of code
}
__finally
{
// __finally block
}
Příklady najdete v tématu Použití obslužné rutiny ukončení.
Stejně jako u obslužné rutiny výjimky vyžaduje __try i blok __finally složené závorky ({}) a použití příkazu goto pro přechod do některého bloku není povoleno.
Blok __try obsahuje strážené tělo kódu, které je chráněno obslužnou rutinou ukončení. Funkce může mít libovolný počet obslužných rutin ukončení a tyto bloky zpracování ukončení můžou být vnořené do stejné funkce nebo do různých funkcí.
Blok __finally se spustí vždy, když tok řízení opustí __try blok. Blok __finally se však nespustí, pokud zavoláte některou z následujících funkcí v rámci bloku __try: ExitProcess, ExitThreadnebo .
Blok __finally se spustí v kontextu funkce, ve které se nachází obslužná rutina ukončení. To znamená, že blok __finally má přístup k místním proměnným dané funkce. Spuštění bloku __finally může ukončit některým z následujících způsobů.
- Provedení posledního příkazu v bloku a pokračování další instrukce
- Použití řídicího příkazu (návratové, přerušení, pokračovatnebo goto)
- Použití longjmp nebo přechod na obslužnou rutinu výjimky
Pokud se spuštění bloku __try ukončí kvůli výjimce, která vyvolá blok zpracování výjimek obslužné rutiny výjimky založené na rámci, spustí se blok __finally před spuštěním bloku zpracování výjimek. Podobně volání longjmp funkce knihovny runtime jazyka C z bloku __try způsobí spuštění bloku __finally před spuštěním v cíli operace longjmp. Pokud se provádění bloku __try ukončí z důvodu řídicího příkazu (vrátit, přerušení, pokračovatnebo přejít), spustí se __finally blok.
Funkci AbnormalTermination lze použít v rámci bloku __finally k určení, jestli __try blok končil postupně – to znamená, jestli dosáhl konečné závorky (}). Opuštění bloku __try z důvodu volání longjmp, skok na obslužnou rutinu výjimky nebo vrácení, přerušení, pokračovatnebo goto prohlášení, se považuje za neobvyklé ukončení. Všimněte si, že selhání postupného ukončení způsobí, že systém prohledá všechny rámce zásobníku v opačném pořadí, aby bylo možné určit, zda se musí volat nějaké obslužné rutiny ukončení. To může vést ke snížení výkonu kvůli provádění stovek instrukcí.
Aby se zabránilo neobvyklému ukončení obslužné rutiny ukončení, mělo by provádění pokračovat na konec bloku. Můžete také spustit příkaz __leave. Příkaz __leave umožňuje okamžité ukončení bloku __try, aniž by to způsobilo neobvyklé ukončení a jeho snížení výkonu. Zkontrolujte dokumentaci kompilátoru a zjistěte, jestli je příkaz __leave podporovaný.
Pokud se provádění bloku __finally ukončí z důvodu návratu kontrolního příkazu, je ekvivalentní goto na pravou závorku v ohraničující funkci. Proto se ohraničující funkce vrátí.