Delen via


try-except-instructie (C)

microsoft-specifieke

De try-except instructie is een Microsoft-extensie voor de C-taal waarmee toepassingen controle kunnen krijgen over een programma wanneer gebeurtenissen die normaal gesproken de uitvoering beëindigen, plaatsvinden. Dergelijke gebeurtenissen worden uitzonderingen genoemd en het mechanisme waarmee uitzonderingen worden behandeld, wordt gestructureerde uitzonderingsafhandeling genoemd.

Uitzonderingen kunnen hardware of software zijn. Zelfs wanneer toepassingen niet volledig kunnen herstellen van hardware- of softwareuitzondering, maakt de verwerking van gestructureerde uitzonderingen het mogelijk om foutinformatie te registreren en weer te geven. Het is handig om de interne status van de toepassing te onderschekken om het probleem te diagnosticeren. Het is met name handig voor onregelmatige problemen die niet gemakkelijk te reproduceren zijn.

Syntaxis

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

De samengestelde instructie na de __try component is de beveiligde sectie. De samengestelde instructie na de __except component is de uitzonderingshandler. De handler geeft een reeks acties op die moeten worden uitgevoerd als er een uitzondering wordt gegenereerd tijdens de uitvoering van de beveiligde sectie. De uitvoering gaat als volgt:

  1. De beveiligde sectie wordt uitgevoerd.

  2. Als er geen uitzondering optreedt tijdens de uitvoering van de beveiligde sectie, wordt de uitvoering voortgezet op de instructie na de __except component.

  3. Als er een uitzondering optreedt tijdens de uitvoering van de beveiligde sectie of in een routine die wordt aanroepen door de beveiligde sectie, wordt de __except expressie geëvalueerd. De geretourneerde waarde bepaalt hoe de uitzondering wordt verwerkt. Er zijn drie mogelijke waarden:

    • EXCEPTION_CONTINUE_SEARCH: De uitzondering wordt niet herkend. Ga door met het zoeken naar de stack naar een handler, eerst voor het bevatten try-except van instructies en vervolgens voor handlers met de volgende hoogste prioriteit.

    • EXCEPTION_CONTINUE_EXECUTION: De uitzondering wordt herkend maar gesloten. Ga door met de uitvoering op het punt waarop de uitzondering is opgetreden.

    • EXCEPTION_EXECUTE_HANDLER De uitzondering wordt herkend. Breng het besturingselement over naar de uitzonderingshandler door de __except samengestelde instructie uit te voeren en ga vervolgens door met de uitvoering op het punt dat de uitzondering is opgetreden.

Omdat de __except expressie wordt geëvalueerd als een C-expressie, is deze beperkt tot één waarde, de operator voor voorwaardelijke expressie of de operator voor komma's. Als uitgebreidere verwerking vereist is, kan de expressie een routine aanroepen die een van de drie bovenstaande waarden retourneert.

Opmerking

De verwerking van gestructureerde uitzonderingen werkt met C- en C++-bronbestanden. Het is echter niet specifiek ontworpen voor C++. Voor draagbare C++-programma's moet de verwerking van C++-uitzonderingen worden gebruikt in plaats van gestructureerde uitzonderingsafhandeling. Bovendien is het C++-mechanisme voor het afhandelen van uitzonderingen veel flexibeler, omdat het uitzonderingen van elk type kan verwerken. Zie De verwerking van uitzonderingen in de C++-taalreferentie voor meer informatie.

Elke routine in een toepassing kan een eigen uitzonderingshandler hebben. De __except expressie wordt uitgevoerd in het bereik van de __try hoofdtekst. Het heeft toegang tot lokale variabelen die daar zijn gedeclareerd.

Het __leave trefwoord is geldig binnen een try-except instructieblok. Het effect is __leave om naar het einde van het try-except blok te springen. De uitvoering wordt hervat na het einde van de uitzonderingshandler. Hoewel een goto instructie kan worden gebruikt om hetzelfde resultaat te bereiken, zorgt een goto instructie ervoor dat stack afwikkelt. De __leave instructie is efficiënter omdat het niet nodig is om stapels te ontspannen.

Het afsluiten van een try-except instructie met behulp van de longjmp runtimefunctie wordt beschouwd als abnormale beëindiging. Het is niet legaal om naar een __try verklaring te springen, maar het is legaal om er een uit te springen. De uitzonderingshandler wordt niet aangeroepen als een proces wordt gedood midden in het uitvoeren van een try-except instructie.

Voorbeeld

Hier volgt een voorbeeld van een uitzonderingshandler en een beëindigingshandler. Zie de instructie (C) voor meer informatie over beëindigingshandlerstry-finally.

.
.
.
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");

Hier volgt de uitvoer uit het voorbeeld, met commentaar toegevoegd aan de rechterkant:

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                  */

Microsoft-specifiek beëindigen

Zie ook

try-except instructie (C++)