Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Spécifique à Microsoft
L’instruction try-except est une extension Microsoft au langage C qui permet aux applications de contrôler un programme lorsque des événements qui se terminent normalement l’exécution se produisent. Ces événements sont appelés exceptions, et le mécanisme qui traite des exceptions est appelé gestion structurée des exceptions.
Les exceptions peuvent être matérielles ou logicielles. Même si les applications ne peuvent pas récupérer complètement à partir d’exceptions matérielles ou logicielles, la gestion structurée des exceptions permet de consigner et d’afficher des informations d’erreur. Il est utile de intercepter l’état interne de l’application pour aider à diagnostiquer le problème. En particulier, il est utile pour les problèmes intermittents qui ne sont pas faciles à reproduire.
Syntaxe
try-except-statement:
__trycompound-statement__except (expression)compound-statement
L’instruction composée après la __try clause est la section protégée. Instruction composée après la __except clause est le gestionnaire d’exceptions. Le gestionnaire spécifie un ensemble d’actions à effectuer si une exception est levée pendant l’exécution de la section protégée. L’exécution se poursuit 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 après la
__exceptclause.Si une exception se produit pendant l’exécution de la section protégée ou dans une routine, les appels
__exceptde section protégée sont évalués. La valeur retournée détermine la façon dont l’exception est gérée. Il existe trois valeurs possibles :EXCEPTION_CONTINUE_SEARCH: l’exception n’est pas reconnue. Continuez à rechercher la pile pour un gestionnaire, tout d’abord pour contenirtry-exceptdes instructions, puis pour les gestionnaires avec la priorité la plus élevée suivante.EXCEPTION_CONTINUE_EXECUTION: l’exception est reconnue mais ignorée. Poursuivez l’exécution au point où l’exception s’est produite.EXCEPTION_EXECUTE_HANDLERL’exception est reconnue. Transférez le contrôle vers le gestionnaire d’exceptions en exécutant l’instruction__exceptcomposée, puis poursuivez l’exécution au moment où l’exception s’est produite.
Étant donné que l’expression __except est évaluée en tant qu’expression C, elle est limitée à une valeur unique, à l’opérateur d’expression conditionnelle ou à l’opérateur de virgule. Si un traitement plus étendu est nécessaire, l’expression peut appeler une routine qui retourne l’une des trois valeurs répertoriées ci-dessus.
Remarque
La gestion structurée des exceptions fonctionne avec les fichiers sources C et C++. Toutefois, il n’est pas spécifiquement conçu pour C++. Pour les programmes C++ portables, la gestion des exceptions C++ doit être utilisée au lieu de la gestion structurée des exceptions. En outre, le mécanisme de gestion des exceptions C++ est beaucoup plus flexible, car il peut gérer les exceptions de n’importe quel type. Pour plus d’informations, consultez Gestion des exceptions dans la référence du langage C++.
Chaque routine d’une application peut avoir son propre gestionnaire d’exceptions. L’expression __except s’exécute dans l’étendue du __try corps. Il a accès à toutes les variables locales déclarées ici.
Le __leave mot clé est valide dans un bloc d’instructions try-except . L’effet est __leave de passer à la fin du try-except bloc. L’exécution reprend après la fin du gestionnaire d’exceptions. Bien qu’une goto instruction puisse être utilisée pour accomplir le même résultat, une goto instruction provoque le déroulement de la pile. L’instruction __leave est plus efficace, car elle n’implique pas le déroulement de la pile.
La sortie d’une try-except instruction à l’aide de la longjmp fonction d’exécution est considérée comme un arrêt anormal. Il n’est pas légal de sauter dans une __try déclaration, mais il est légal de sortir d’un. Le gestionnaire d’exceptions n’est pas appelé si un processus est tué au milieu de l’exécution d’une try-except instruction.
Exemple :
Voici un exemple de gestionnaire d’exceptions et d’un gestionnaire d’arrêt. Pour plus d’informations sur les gestionnaires de terminaison, consultez try-finally l’instruction (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 un 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 */
END Spécifique à Microsoft