En respuesta a la entrada tardía de Tim a la discusión (que también aborda uno de los primeros comentarios de Lev).
Como uno de los que abogó por la separación de la salida de los destructores en el diagrama de estado (argumento basado en un caso de uso real, sobre la interacción con el mundo real, es decir, E / S) cuando se envió a Boost, estoy de acuerdo en que puede haber problemas al poner la salida lógica en destructores. Como era de esperar, David Abrahams también hizo argumentos persuasivos con respecto a la seguridad de excepción. Por esas razones, Statechart no requiere que coloque la lógica en los destructores, pero se lo permite, con los consejos habituales.
La lógica que solo debería ejecutarse como parte de una transición fuera de un estado (no la destrucción del objeto de diagrama de estado en su conjunto) puede (y debería hacerlo si también hay que hacer una limpieza de recursos) en una acción de salida () separada.
Para un estado "delgado" sin estado activo (recursos), solo acciones de entrada / salida para realizar, puede realizar esas acciones en ctor y d'tor y asegurarse de que el constructor y el destructor no se ejecuten. No hay ninguna razón para que lo hagan, no hay un estado en el que realizar RAII, no hay nada malo en que el manejo de errores en estos lugares genere eventos apropiados. Sin embargo, es posible que deba considerar si desea que las acciones de salida que alteran el estado externo se ejecuten en la destrucción de la máquina de estado ... y ponerlas en acción de salida si no desea que ocurran en este caso ...
Statechart modela la activación como instanciación de un objeto, por lo que si su constructor tiene trabajo real / activación / instanciación que hacer y si puede fallar de tal manera que no se pueda ingresar el estado, Statechart lo respalda al darle la capacidad de asignar una excepción a un evento. Esto se maneja de una manera que funciona en la jerarquía de estado buscando un estado externo que maneje el evento de excepción, de forma análoga a la forma en que la pila se habría desenrollado para un modelo de invocación basado en la pila de llamadas.
Todo esto está bien documentado. Te sugiero que leas los documentos y lo pruebes. Le sugiero que use destructores para limpiar "recursos de software" y acciones de salida para realizar "acciones de salida del mundo real".
Vale la pena señalar que la propagación de excepciones es un problema en todos los entornos controlados por eventos, no solo en los gráficos de estado. Es mejor razonar e incluir fallas / errores en el diseño de su diagrama de estado y si y solo si no puede manejarlos de otra manera recurra al mapeo de excepciones. Al menos eso funciona para mí, ymmmv ...