Partager via


Synchronisation de la gestion des exceptions : Un résumé

Un gestionnaire d’arrêt est exécuté quel que soit le mode d’arrêt du __try bloc d’instructions. Les causes incluent le saut du __try bloc, une longjmp instruction qui transfère le contrôle hors du bloc et le déroulement de la pile en raison de la gestion des exceptions.

Remarque

Le compilateur Microsoft C++ prend en charge deux formes des instructions et longjmp des setjmp instructions. La version rapide ignore la gestion du bloc de fin mais est plus efficace. Pour utiliser cette version, incluez le fichier <setjmp.h>. L'autre version prend en charge la gestion du bloc de fin, comme il est décrit dans le paragraphe précédent. Pour utiliser cette version, incluez le fichier <setjmpex.h>. L'augmentation des performances 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 que tout autre code soit exécuté, notamment 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 qui doit être terminé. L'ordre des événements est le suivant :

  1. une exception est levée.

  2. Le système examine la hiérarchie des gestionnaires d’exceptions actifs et exécute le filtre du gestionnaire avec la priorité la plus élevée. C’est le gestionnaire d’exceptions le plus récemment installé et le plus profondément imbriqué, en passant par des blocs et des appels de fonction.

  3. Si ce filtre passe le contrôle (retourne 0), le processus se poursuit jusqu’à ce qu’un filtre soit trouvé qui ne passe pas de contrôle.

  4. Si ce filtre retourne -1, l’exécution continue à l’endroit où l’exception a été levée et aucun arrêt n’a lieu.

  5. Si le filtre retourne 1, les événements suivants se produisent :

    • Le système déroulait la pile : il efface toutes les trames de pile entre l’emplacement où l’exception a été levée et la trame de pile qui contient le gestionnaire d’exceptions.

    • Au fur et à mesure que la pile est déroulée, chaque gestionnaire de terminaisons figurant sur la pile est exécuté.

    • Le gestionnaire d'exceptions lui-même est exécuté.

    • La ligne de code prend la main après la fin de ce gestionnaire d'exceptions.

Voir aussi

Écriture d’un gestionnaire de terminaison
Structured Exception Handling (C/C++)