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 :
La section protégée est exécutée.
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
.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 instructionstry-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