try-except-instruktion (C)

Microsoft-specifika

Instruktionen try-except är ett Microsoft-tillägg till C-språket som gör det möjligt för program att få kontroll över ett program när händelser som normalt avslutar körningen inträffar. Sådana händelser kallas undantag och den mekanism som hanterar undantag kallas för strukturerad undantagshantering.

Undantag kan vara antingen maskinvarubaserade eller programvarubaserade. Även om program inte kan återställas helt från maskinvaru- eller programvarufel gör strukturerad undantagshantering det möjligt att logga och visa felinformation. Det är användbart att fånga programmets interna tillstånd för att diagnostisera problemet. I synnerhet är det användbart för tillfälliga problem som inte är lätta att återskapa.

Syntax

try-except-statement:
__try compound-statement __except ( expression ) compound-statement

Den sammansatta instruktionen __try efter satsen är det skyddade avsnittet. Den sammansatta instruktionen __except efter -satsen är undantagshanteraren. Hanteraren anger en uppsättning åtgärder som ska utföras om ett undantag utlöses under körningen av det skyddade avsnittet. Körningen fortsätter på följande sätt:

  1. Det skyddade avsnittet körs.

  2. Om inget undantag inträffar under körningen av det skyddade avsnittet fortsätter körningen vid -instruktionen __except efter -satsen.

  3. Om ett undantag inträffar under körningen av det skyddade avsnittet, eller i någon rutin som det skyddade avsnittet anropar, __except utvärderas uttrycket. Det returnerade värdet avgör hur undantaget hanteras. Det finns tre möjliga värden:

    • EXCEPTION_CONTINUE_SEARCH: Undantaget känns inte igen. Fortsätt att söka efter en hanterare i stacken, först för att innehålla try-except instruktioner och sedan efter hanterare med näst högsta prioritet.

    • EXCEPTION_CONTINUE_EXECUTION: Undantaget identifieras men avvisas. Fortsätt körningen vid den tidpunkt då undantaget inträffade.

    • EXCEPTION_EXECUTE_HANDLER Undantaget identifieras. Överför kontrollen till undantagshanteraren genom att köra den sammansatta instruktionen __except och fortsätt sedan körningen vid den tidpunkt då undantaget inträffade.

Eftersom uttrycket __except utvärderas som ett C-uttryck är det begränsat till antingen ett enda värde, operatorn för villkorsuttryck eller kommaoperatorn. Om mer omfattande bearbetning krävs kan uttrycket anropa en rutin som returnerar ett av de tre värden som anges ovan.

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.

Varje rutin i ett program kan ha en egen undantagshanterare. Uttrycket __except körs i brödtextens __try omfång. Den har åtkomst till alla lokala variabler som deklareras där.

Nyckelordet __leave är giltigt i ett try-except instruktionsblock. Effekten av __leave är att hoppa till slutet av try-except blocket. Körningen återupptas efter att undantagshanteraren har avslutats. Ä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-except instruktion med hjälp av longjmp körningsfunktionen anses vara onormal avslutning. Det är inte lagligt att hoppa in i ett __try uttalande, men det är lagligt att hoppa ur ett. Undantagshanteraren anropas inte om en process avlivas mitt i körningen av en try-except -instruktion.

Exempel

Här är ett exempel på en undantagshanterare och en avslutningshanterare. Mer information om avslutningshanterare finns i try-finally instruktionen (C).

.
.
.
puts("hello");
__try {
   puts("in try");
   __try {
      puts("in try");
      RAISE_AN_EXCEPTION();
   } __finally {
      puts("in finally");
   }
} __except( puts("in filter"), EXCEPTION_EXECUTE_HANDLER ) {
   puts("in except");
}
puts("world");

Här är utdata från exemplet, med kommentarer till höger:

hello
in try              /* fall into try                        */
in try              /* fall into nested try                 */
in filter           /* execute filter; returns 1 so accept  */
in finally          /* unwind nested finally                */
in except           /* transfer control to selected handler */
world               /* flow out of handler                  */

END Microsoft-specifik

Se även

try-except instruktion (C++)