propagation des exceptions dans les bibliothèques C liées de manière externe

J’écris une bibliothèque C ++ qui utilise une bibliothèque C tierce externe. Ainsi, ma bibliothèque appellera les fonctions de cette bibliothèque tierce et cette dernière rappellera une autre partie de ma bibliothèque.

Je me demande ce qu’il advient des exceptions dans ce cas? Say MyLib :: foo () appelle une fonction de bibliothèque C externe qui appelle finalement MyLib :: bar (), et bar lève une exception. L’exception sera-t-elle correctement propagée à un gestionnaire dans foo ()?

Merci!

L’exception sera-t-elle correctement propagée à un gestionnaire dans foo() ?

Je pense que si les exceptions se propagent par le code C externe est indéfini. Pire encore, le code C n’est pas préparé et ne peut pas gérer l’exception. Le code C n’a pas besoin d’être immunisé contre les retours soudains et inattendus, il ne connaît donc pas RAII, etc.

Lorsque j’ai eu à faire face à une telle situation, j’ai intercepté l’exception avant de revenir à l’API C, je l’ai stockée et je l’ai relancée une fois que l’appel est revenu de l’API C.

C’est un détail d’implémentation de plate-forme lourd. En général, la plomberie d’exception est quelque peu susceptible de pouvoir dérouler la stack au moyen de frameworks d’activation de fonction C. Nécessaire car le CRT est souvent écrit en C. Cependant, il est peu probable que le code C en soit satisfait, l’état ayant subi une mutation qui ne peut pas être restauré.

Juste au cas où il s’agit de Windows, le code C a une chance de le faire. Les exceptions C ++ sont intégrées au support d’exception générique intégré à Windows, appelé SEH (Structured Exception Handling). Vous utilisez les mots-clés __try et __except pour appeler un filtre d’exception capable de restaurer l’état du code C. Évidemment, ce n’est pas portable.

Ne posez jamais une question sur les détails de la mise en œuvre sans mentionner les détails de la mise en œuvre, s’il vous plaît.

Lisez (et achetez!) Les normes de codage C ++ de Herb Sutter

# 62: Ne laissez pas les exceptions se propager à travers les limites du module.