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 :
La section protégée est exécutée.
Le gestionnaire de terminaisons est appelé.
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 instructiongoto
hors du corps protégé ou via une instructionreturn
), 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