try-except, instruction (C)

Spécifique à Microsoft

L’instruction try-except est une extension Microsoft du langage C qui permet aux applications d’assumer le contrôle d’un programme lorsque surviennent des événements qui terminent normalement l’exécution. Ces événements sont appelés « exceptions » et le mécanisme de gestion des exceptions s'appelle « gestion structurée des exceptions ».

Les exceptions peuvent être basées sur le matériel ou sur le logiciel. Même quand des applications ne peuvent pas complètement récupérer à partir d’exceptions matérielles ou logicielles, la gestion structurée des exceptions permet de journaliser et d’afficher des informations d’erreur. Il est utile d’intercepter l’état interne de l’application pour faciliter le diagnostic du problème. C’est particulièrement utile pour les problèmes intermittents qui ne sont pas faciles à reproduire.

Syntaxe

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

L’instruction composée après la clause __try est la section protégée. L’instruction composée après la clause __except est le gestionnaire d’exceptions. Le gestionnaire spécifie un ensemble d’actions à entreprendre si une exception est levée pendant l’exécution de la section protégée. L'exécution se déroule comme suit :

  1. La section protégée est exécutée.

  2. Si aucune exception ne se produit pendant l'exécution de la section protégée, l'exécution se poursuit à l'instruction située après la clause __except.

  3. Si une exception est levée pendant l’exécution de la section protégée ou dans toute routine appelée par la section protégée, l’expression __except est évaluée. La valeur retournée détermine comment l’exception est gérée. Il existe trois valeurs possibles :

    • EXCEPTION_CONTINUE_SEARCH : l’exception n’est pas reconnue. Poursuivre la recherche d’un gestionnaire dans la pile, en premier pour qu’il contienne des instructions try-except, puis pour les gestionnaires avec la priorité la plus élevée suivante.

    • EXCEPTION_CONTINUE_EXECUTION : l’exception est reconnue mais ignorée. Poursuivre l'exécution au point où l'exception s'est produite.

    • EXCEPTION_EXECUTE_HANDLER : l’exception est reconnue. Transférez le contrôle au gestionnaire d'exceptions en exécutant l'instruction composée __except, puis continuez l'exécution au point où l'exception s'est produite.

L’expression __except étant évaluée comme une expression C, elle est limitée à une valeur unique, à l’opérateur d’expression conditionnelle, ou à l’opérateur virgule. Si un traitement plus étendu est requis, l'expression peut appeler une routine qui retourne l'une des trois valeurs répertoriées ci-dessus.

Notes

La gestion structurée des exceptions fonctionne avec les fichiers sources C et C++. Toutefois, il n’est pas conçu spécifiquement pour C++. Pour les programmes C++ portables, la gestion des exceptions C++ doit être utilisée à la place de la gestion structurée des exceptions. En outre, le mécanisme de gestion des exceptions C++ est beaucoup plus souple, car il peut gérer les exceptions de tout type. Pour plus d’informations, consultez Gestion des exceptions dans le Guide de référence du langage C++.

Chaque routine dans une application peut avoir son propre gestionnaire d'exceptions. L'expression __except s'exécute dans la portée du corps __try. Elle a accès à toutes les variables locales déclarées à cet endroit.

Le mot clé __leave est valide dans un bloc d'instructions try-except. L'effet exercé par __leave est de sauter à la fin du bloc try-except. L'exécution reprend après la fin du gestionnaire d'exceptions. Bien qu'une instruction goto puisse être utilisée pour obtenir le même résultat, une instruction goto provoque le déroulement de pile. L’instruction __leave est plus efficace car elle n’implique pas le déroulement de pile.

Le fait de quitter une instruction try-except à l’aide de la fonction runtime longjmp est considéré comme un arrêt anormal. Il n’est pas conforme de sauter dans une instruction __try, mais il est conforme d’en sortir. Le gestionnaire d’exceptions n’est pas appelé si un processus est tué au milieu de l’exécution d’une instruction try-except.

Exemple

Voici un exemple de gestionnaire d’exceptions et de gestionnaire d’arrêt. Pour plus d’informations sur les gestionnaires de terminaison, consultez l’instruction try-finally (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");

Voici la sortie de l’exemple, avec le commentaire ajouté à droite :

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

FIN de la section spécifique à Microsoft

Voir aussi

Instruction try-except (C++)