Mélange d'exceptions C (structurées) et d'exceptions C++
Si vous voulez écrire du code plus portable, l'utilisation d'une gestion des exceptions structurées dans un programme C++ n'est pas recommandée. Toutefois, vous pouvez parfois souhaiter compiler avec /EHa et associer des exceptions structurées et du code source C++, et vous avez besoin d'une fonctionnalité pour gérer ces deux types d'exceptions. Un gestionnaire d'exceptions structurées n'ayant aucun concept des objets ou des exceptions typées, il ne peut pas gérer les exceptions levées par du code C++. Toutefois, les gestionnaires catch C++ peuvent gérer les exceptions structurées. Ainsi, la syntaxe de gestion des exceptions C++ (try, throw, catch) n'est pas acceptée par le compilateur C, mais la syntaxe de gestion structurée des exceptions (__try, __except, __finally) est prise en charge par le compilateur C++.
Consultez _set_se_translator pour plus d'informations sur la gestion des exceptions structurées en tant qu'exceptions C++.
Si vous combinez des exceptions structurées et C++, notez les éléments suivants :
Les exceptions C++ et les exceptions structurées ne peuvent pas être mélangées dans la même fonction.
Les gestionnaires de terminaisons (blocs __finally) sont toujours exécutés, même pendant le déroulement après qu'une exception soit levée.
La gestion des exceptions C++ peut intercepter et conserver les sémantiques de déroulement dans tous les modules compilés avec l'option du compilateur /EH (cette option active les sémantiques de déroulement).
Il peut exister des situations où les fonctions de destructeur ne sont pas appelées pour tous les objets. Par exemple, si une exception structurée se produit lors d'une tentative d'appel de fonction via un pointeur fonction non initialisé, et si cette fonction prend comme paramètres des objets ayant été construits avant l'appel, ces objets n'auront pas leurs destructeurs appelés durant le déroulement de pile.