Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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.