Partager via


instruction de try-finally

Spécifique à Microsoft

la syntaxe suivante décrit l'instruction d' try-finally :

__try {
   // guarded code
}
__finally {
   // termination code
}

Grammaire

  • essai-enfin-instruction:
    instruction composée d'__try

    instruction composée d'__finally

L'instruction d' try-finally est une extension Microsoft aux langages C et C++ qui permet aux applications cibles de garantir l'exécution de code de nettoyage lorsque l'exécution d'un bloc de code est interrompue.Le nettoyage se compose des tâches telles que la libération de la mémoire, une fermeture de fichiers, et libérer des handles de fichiers.L'instruction d' try-finally est particulièrement utile pour les routines qui ont plusieurs endroits où un contrôle est effectuée pour une erreur qui peut provoquer un retour prématuré de la routine.

Pour plus d'informations et un exemple de code, consultez l' instruction try-except l'instruction.Pour plus d'informations sur la gestion structurée des exceptions voir en général le gestion structurée des exceptions.Pour plus d'informations sur la gestion des exceptions dans les applications managées, consultez gestion des exceptions sous /clr.

[!REMARQUE]

La gestion structurée des exceptions fonctionne avec Win32 pour les fichiers sources C et C++.Toutefois, il n'est pas spécifiquement conçue pour C++.Vous pouvez garantir que votre code est plus portable à l'aide de la gestion des exceptions C++.En outre, la gestion des exceptions C++ est plus flexible, car elle peut gérer les exceptions de tout type.Pour les programmes C++, il est recommandé d'utiliser le mécanisme de gestion des exceptions C++ (instructions detentative, Catch, et jet ).

l'instruction composée après la clause d' __try est la section protégée.l'instruction composée après la clause d' __finally est le gestionnaire de terminaisons.Le gestionnaire spécifie un jeu d'actions qui s'exécutent lorsque la section protégée est quittée, que la section protégée est quittée par une exception (anormal), ou par la série standard (arrêt normal).

Le contrôle atteint une instruction d' __try par exécution séquentielle simple (exécuter).Lorsque le contrôle passe à __try, son gestionnaire associé devient actif.Si l'ordre d'exécution atteint la fin du bloc try, l'exécution se poursuit comme suit :

  1. le gestionnaire de terminaisons est appelé.

  2. Lorsque le gestionnaire de terminaisons terminée, l'exécution reprend après l'instruction d' __finally .Indépendamment de la façon dont la section protégée terminé (par exemple, via goto extérieur de le corps protégé ou d'une instruction d' return ), le gestionnaire de terminaisons est before exécuté que le flux de contrôle sort de la section protégée.

    Une instruction de __finally ne bloque pas rechercher un gestionnaire d'exceptions approprié.

Si une exception est levée dans le bloc d' __try , le système d'exploitation doit rechercher un gestionnaire pour l'exception ou que le programme échoue.Si un gestionnaire est trouvé, l'intégralité de blocs d' __finally sont exécutés et résumés d'exécution dans le gestionnaire.

Par exemple, supposons une série de la fonction A de liens d'appels de fonction pour fonctionner D, comme indiqué dans l'illustration suivante.chaque fonction a un gestionnaire de terminaisons.Si une exception est levée dans la fonction D et gérée dans Un, les gestionnaires de terminaisons sont appelés dans l'ordre à mesure que le système déroule la pile : D, C, B.

Ordre d'exécution du gestionnaire de terminaisons

Fin d'un ordre d'exécution de gestionnaire

[!REMARQUE]

Le comportement de l'try-finally est différent d'autres langages qui prennent en charge l'utilisation de finally, tel que c#.__try unique peut avoir l'une ou l'autre, mais pas les deux, __finally et __except.Si les deux doivent être utilisés conjointement, un externe instruction try-except l'instruction doit joindre instructions internes de try-finally.Les règles spécifiant lorsque chaque bloc est également différentes.

Le mot clé de __leave

Le mot clé d' __leave est valide uniquement dans la section protégée d'une instruction d' try-finally , et son effet d'accéder à la fin de la section protégée.l'exécution continue à la première instruction dans le gestionnaire de terminaisons.

Une instruction d' goto peut également ignorer de la section protégée, mais elle dégrade les performances car elle appelle le déroulement de pile.L'instruction d' __leave est plus efficace car elle ne provoque pas le déroulement de pile.

Un arrêt anormal

Quittant une instruction d' try-finally à l'aide de la fonction runtime de longjmp est considéré comme un arrêt anormal.Il n'est pas conforme d'accéder dans une instruction d' __try , mais permis de saut en dehors d'une.Toutes les instructions d' __finally actives entre le point de départ (fermeture du bloc d' __try ) et de destination (le bloc d' __except qui gère l'exception) doivent être exécutées.Cela est appelé un déroulement local.

Si un bloc de test est prématurément complet pour une raison quelconque, y compris un saut hors de le bloc, le système exécute le bloc associé de finally dans le cadre de le processus de déroulement de la pile.Dans ce cas, retourne TRUE de fonction d' AbnormalTermination en cas de appel du bloc de finally ; sinon, il retourne FALSE.

Le gestionnaire de terminaisons n'est pas appelé si un processus est tué au milieu de l'exécution d'une instruction d' try-finally .

détail de FIN Microsoft

Voir aussi

Référence

Écrire un gestionnaire de terminaisons

Gestion structurée des exceptions (C++)

Mots clés C++

Termination-Handler Syntax