try-finally-instruktion (C)

Microsoft-specifika

-instruktionen try-finally är ett Microsoft-tillägg till C-språket som gör det möjligt för program att garantera körning av rensningskod när körningen av ett kodblock avbryts. Rensning består av uppgifter som att frigöra minne, stänga filer och släppa filhandtag. -instruktionen try-finally är särskilt användbar för rutiner som har flera platser där en kontroll görs för ett fel som kan orsaka för tidig retur från rutinen.

try-finally-statement:
__try compound-statement __finally compound-statement

Den sammansatta instruktionen __try efter satsen är det skyddade avsnittet. Den sammansatta instruktionen __finally efter satsen är avslutningshanteraren. Hanteraren anger en uppsättning åtgärder som körs när det skyddade avsnittet avslutas. Det spelar ingen roll om det skyddade avsnittet avslutas av ett undantag (onormal avslutning) eller av standardfall (normal avslutning).

Kontrollen når en __try instruktion genom enkel sekventiell körning (faller igenom). När kontrollen anger -instruktionen __try blir dess associerade hanterare aktiv. Körningen fortsätter på följande sätt:

  1. Det skyddade avsnittet körs.

  2. Avslutningshanteraren anropas.

  3. När avslutningshanteraren är klar fortsätter körningen efter -instruktionen __finally . Oavsett hur det skyddade avsnittet slutar (till exempel via en goto instruktion från den skyddade brödtexten eller via en return instruktion) körs avslutningshanteraren innan kontrollflödet flyttas ut från det skyddade avsnittet.

Nyckelordet __leave är giltigt i ett try-finally instruktionsblock. Effekten av __leave är att hoppa till slutet av try-finally blocket. Avslutningshanteraren körs omedelbart. Även om en goto instruktion kan användas för att uppnå samma resultat, orsakar en goto instruktion att stacken varvar ned. -instruktionen __leave är effektivare eftersom den inte innebär att stacken varvar ned.

Att avsluta en try-finally instruktion med hjälp av en return -instruktion eller körningsfunktionen longjmp anses vara onormal avslutning. Det är inte lagligt att hoppa in i ett __try uttalande, men lagligt att hoppa ur ett. Alla __finally instruktioner som är aktiva mellan avgångsplatsen och målet måste köras. Det kallas för en lokal varva ner.

Avslutningshanteraren anropas inte om en process avbryts när en try-finally -instruktion körs.

Anmärkning

Strukturerad undantagshantering fungerar med C- och C++-källfiler. Den är dock inte särskilt utformad för C++. För portabla C++-program ska C++-undantagshantering användas i stället för strukturerad undantagshantering. Dessutom är mekanismen för C++-undantagshantering mycket mer flexibel, eftersom den kan hantera undantag av alla typer. Mer information finns i Undantagshantering i C++-språkreferensen.

Se exemplet för -instruktionentry-except för att se hur -instruktionen try-finally fungerar.

END Microsoft-specifik

Se även

try-finally instruktion (C++)