try-finally, instruction (C)

Spécifique à Microsoft

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

try-finally-statement:
__try compound-statement __finally 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 __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 fermée. Il n’est pas important que la section protégée soit fermée par une exception (fin anormale) ou par un passage standard (fin normale).

Le contrôle atteint une instruction __try par exécution séquentielle simple (passage). Lorsque le contrôle pénètre dans l'instruction __try, son gestionnaire associé devient actif. L'exécution se déroule comme suit :

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

  2. Le gestionnaire de terminaisons est appelé.

  3. Lorsque le gestionnaire de terminaisons se termine, l'exécution reprend après l'instruction __finally. Quelle que soit la façon dont la section protégée se termine (par exemple, via une instruction goto hors du corps protégé ou via une instruction return), le gestionnaire de terminaisons est exécuté avant que le flux de contrôle ne sorte de la section protégée.

Le mot clé __leave est valide dans un bloc d'instructions try-finally. L'effet exercé par __leave est de sauter à la fin du bloc try-finally. Le gestionnaire de terminaisons est immédiatement exécuté. 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.

Sortir d'une instruction try-finally à l'aide d'une instruction return ou d'une fonction runtime longjmp est considéré comme une fin anormale. Il n’est pas conforme de sauter dans une instruction __try, mais il est conforme d’en sortir. Toutes les instructions __finally actives entre le point de départ et la destination doivent être exécutées. Cela s’appelle un déroulement local.

Le gestionnaire de terminaisons n’est pas appelé si un processus est tué tout en exécutant une instruction try-finally.

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++.

Consultez l’exemple pour l’instruction try-except pour voir comment l’instruction try-finally fonctionne.

FIN de la section spécifique à Microsoft

Voir aussi

Instruction try-finally (C++)