En réponse à l'entrée tardive de Tim dans la discussion (qui répond également à l'un des tout premiers commentaires de Lev).
En tant que l'un de ceux qui ont plaidé pour la séparation de la sortie des destructeurs dans le statechart (argument basé sur un cas d'utilisation réel, à propos de l'interaction avec le monde réel, c'est-à-dire les E / S) il y a longtemps quand il a été soumis à Boost, je suis d'accord qu'il peut y avoir des problèmes pour mettre exit logique dans les destructeurs. Sans surprise, David Abrahams a également présenté des arguments convaincants concernant la sécurité des exceptions. Pour ces raisons, Statechart ne vous oblige pas à mettre de la logique dans les destructeurs - mais il vous le permet - avec les conseils habituels.
La logique qui ne devrait jamais s'exécuter que dans le cadre d'une transition hors d'un état (et non la destruction de l'objet d'états dans son ensemble) peut (et devrait s'il y a aussi un nettoyage de ressources à faire) être séparée en une action exit () distincte.
Pour un état "léger" sans état actif (ressources), juste des actions d'entrée / sortie à effectuer, vous pouvez effectuer ces actions dans ctor et d'tor et vous assurer que le constructeur et le destructeur ne lancent pas. Il n'y a aucune raison pour eux - il n'y a pas d'état sur lequel exécuter RAII - il n'y a aucun mal à ce que la gestion des erreurs dans ces endroits déclenche des événements appropriés. Vous devrez peut-être encore déterminer si vous voulez que les actions de sortie qui modifient l'état externe s'exécutent sur la destruction de la machine à états ... et les mettre en action de sortie si vous ne voulez pas qu'elles se produisent dans ce cas ...
Statechart modélise l'activation comme instanciation d'un objet, donc si votre constructeur a un vrai travail / activation / instanciation à faire et s'il est capable d'échouer de telle sorte que l'état ne puisse pas être entré Statechart prend en charge cela en vous donnant la possibilité de mapper une exception à un un événement. Ceci est géré d'une manière qui travaille la hiérarchie des états à la recherche d'un état externe qui gère l'événement d'exception, analogue à la façon dont la pile se serait déroulée pour un modèle d'appel basé sur une pile d'appels.
Tout cela est bien documenté - je vous suggère de lire la documentation et de l'essayer. Je vous suggère d'utiliser des destructeurs pour nettoyer les «ressources logicielles» et les actions de sortie pour effectuer des «actions de sortie du monde réel».
Il est à noter que la propagation d'exceptions est un peu un problème dans tous les environnements pilotés par les événements, pas seulement dans les statecharts. Il est préférable de raisonner et d'inclure les défauts / erreurs dans la conception de votre diagramme d'états et si et seulement si vous ne pouvez pas les gérer d'une autre manière, utilisez le mappage d'exceptions. Au moins cela fonctionne pour moi - ymmmv ....