Lancement d'exceptions à partir de destructeurs : le dilemme des exceptions imbriquées
En C , lancer des exceptions à partir de destructeurs pose un défi particulier. Lorsqu'un destructeur est invoqué, il est possible qu'une autre exception soit déjà active. Cette ambiguïté soulève la question de savoir comment gérer de telles situations.
Traditionnellement, C s'appuie sur l'appel de std::terminate ou std::terminate_handler lorsque des exceptions sont levées par des destructeurs. Cette approche garantit que toutes les exceptions actives sont terminées de manière décisive.
Cependant, C 11 a introduit std::nested_exception, une fonctionnalité qui permet l'imbrication des exceptions. Il a été initialement considéré comme une solution potentielle pour gérer les exceptions des destructeurs. En imbriquant la nouvelle exception dans l'exception active, le problème de la priorité des exceptions pourrait être résolu.
Malgré son potentiel, cette idée n'a pas été adoptée dans C 11 ou C 14. La décision a été prise de conserver le comportement d'origine d'appeler std::terminate.
Avantages et inconvénients de Nested Exceptions
Bien que l'imbrication des exceptions offre l'avantage de préserver les informations des deux exceptions, elle présente également des inconvénients potentiels. Par exemple, cela pourrait introduire des effets secondaires inattendus ou interférer avec le comportement attendu de std::terminate.
Solutions alternatives
Actuellement, il n'est pas prévu de revoir le utilisation d'exceptions imbriquées pour gérer les exceptions des destructeurs en C 17. Au lieu de cela, des approches alternatives sont recommandées, telles que comme :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!