Dela via


Termination-Handler syntax

Nyckelorden __try och __finally används för att skapa en avslutningshanterare. I följande exempel visas strukturen för en avslutningshanterare.

__try 
{ 
    // guarded body of code 
 
} 
__finally 
{ 
    // __finally block 
 
}

Exempel finns i Använda en avslutningshanterare.

Precis som med undantagshanteraren kräver både __try-blocket och __finally-blocket klammerparenteser ({}), och det är inte tillåtet att använda en goto--instruktion för att hoppa in i något av blocken.

Det __try blocket innehåller den skyddade kodtexten som skyddas av avslutningshanteraren. En funktion kan ha valfritt antal avslutningshanterare, och dessa avslutningshanteringsblock kan kapslas i samma funktion eller i olika funktioner.

Det __finally blocket körs när kontrollflödet lämnar __try blocket. Det __finally blocket körs dock inte om du anropar någon av följande funktioner i __try blocket: ExitProcess, ExitThreadeller avbryta.

Det __finally blocket körs i kontexten för funktionen där avslutningshanteraren finns. Det innebär att det __finally blocket kan komma åt funktionens lokala variabler. Körningen av __finally blocket kan avslutas på något av följande sätt.

  • Körning av den sista instruktionen i blocket och fortsättning till nästa instruktion
  • Använda en kontrolluttryck (returnera, bryta, fortsättaeller goto)
  • Användning av longjmp- eller ett hopp till en undantagshanterare

Om körningen av __try-blocket avslutas på grund av ett undantagsfel som anropar undantagshanteringsblocket för en rambaserad undantagshanterare, körs det __finally blocket innan undantagshanteringsblocket körs. På samma sätt orsakar ett anrop till funktionen longjmp C-körningsbibliotek från __try-blocket körningen av __finally-blocket innan körningen återupptas vid målet för åtgärden longjmp. Om __try blockkörning avslutas på grund av en kontrolluttryck (returnera, bryta, fortsättaeller goto), körs __finally blocket.

Funktionen AbnormalTermination kan användas i det __finally blocket för att avgöra om det __try blocket avslutades sekventiellt, det vill säga om det nådde den avslutande klammerparentesen (}). Att lämna __try-blocket på grund av ett anrop till longjmp, ett hopp till en undantagshanterare eller en returnera, pausa, fortsätta, eller goto-instruktion, anses vara en onormal avslutning. Observera att om det inte avslutas sekventiellt kan systemet söka igenom alla stackramar i omvänd ordning för att avgöra om några avslutningshanterare måste anropas. Detta kan resultera i prestandaförsämring på grund av körningen av hundratals instruktioner.

För att undvika onormal avslutning av avslutningshanteraren bör körningen fortsätta till slutet av blocket. Du kan också köra __leave-instruktionen. __leave-instruktionen möjliggör omedelbar uppsägning av __try-blocket utan att orsaka onormal uppsägning och dess prestandastraff. Kontrollera dokumentationen för kompilatorn för att avgöra om __leave-instruktionen stöds.

Om körningen av __finally-blocket avslutas på grund av returnerar kontrolluttryck, motsvarar det en goto- till den avslutande klammerparentesen i den omslutande funktionen. Därför returneras den omslutande funktionen.