Synchronisation de gestion des exceptions : Un résumé
Un gestionnaire de terminaisons est exécuté quelle que soit la façon dont le bloc d'instructions d' __try est terminé.Les causes incluent ignorer du bloc d' __try , une instruction d' longjmp que transfère le contrôle en dehors de le bloc, et de déroulement de la pile en raison de la gestion des exceptions.
[!REMARQUE]
Visual C++ prend en charge deux formes d'instructions d' setjmp et d' longjmp .La gestion rapide d'arrêt de ignore de version mais est plus efficace.Pour utiliser cette version, incluez le fichier SETJMP.H.L'autre gestion d'arrêt de prises en charge des versions décrite dans le paragraphe précédent.Pour utiliser cette version, incluez le fichier SETJMPEX.H.l'augmentation de la représentation de la version rapide dépend de la configuration matérielle.
Le système d'exploitation exécute tous les gestionnaires de terminaisons dans l'ordre approprié avant tout autre code puisse être exécuté, y compris le corps d'un gestionnaire d'exceptions.
Lorsque la cause de l'interruption est une exception, le système doit d'abord exécuter la partie de filtre d'un ou plusieurs gestionnaires d'exceptions avant de décider ce se terminer.L'ordre des événements est :
Une exception est levée.
Le système examine la hiérarchie des gestionnaires d'exceptions actifs et applique le filtre du gestionnaire avec la priorité la plus élevée ; il s'agit du gestionnaire d'exceptions le plus récemment installé et le plus profondément imbriquées, en termes de blocs et appels de fonction.
Si ce filtre passe la main (retourne 0), le processus se poursuit jusqu'à ce qu'il trouve un filtre qui ne passe pas la main.
Si ce filtre retourne - 1, exécution continue où l'exception a été levée, et aucun arrêt n'est effectué.
Si le filtre retourne 1, les événements suivants se produisent :
Le système déroule la pile, effaçant tous les frames de pile entre le code en cours de exécution (où l'exception a été levée) et le frame de pile qui contient le gestionnaire d'exceptions accorder le contrôle.
À mesure que la pile est déroulée, chaque gestionnaire de terminaisons sur la pile est exécuté.
le gestionnaire d'exceptions lui-même est exécuté.
Le contrôle passe à la ligne de code après la fin de ce gestionnaire d'exceptions.