В ответ на поздний вход Тима в дискуссию (в которой также рассматривается один из самых ранних комментариев Льва).
Как один из тех, кто выступал за выход из отделения от деструкторов в диаграмме состояний (аргумент, основанный наРеальный вариант использования, о взаимодействии с реальным миром, т. е. вводом-выводом, когда он был представлен в Boost, я согласен, что могут возникнуть проблемы с использованием логики выхода в деструкторах.Дэвид Абрахамс неудивительно выдвинул убедительные аргументы и в отношении безопасности исключений.По этим причинам Statechart не требует от вас помещать логику в деструкторы - но это позволяет вам - с обычным советом.
Логика, которая должна выполняться только как часть перехода из состояния (не уничтожение объекта диаграммы состояний в целом), может (и должна, если должна выполняться также очистка ресурса) разделяться на отдельныедействие exit ().
Для «тонкого» состояния без активного состояния (ресурсов), просто выполняемых действий входа / выхода, вы можете выполнить эти действия в ctor и d'tor и убедиться, что конструктор идеструктор не бросай.У них нет причин - нет состояния для выполнения RAII - нет ничего плохого в том, что обработка ошибок в этих местах вызывает соответствующие события.Возможно, вам все еще нужно подумать, хотите ли вы, чтобы выходные действия, которые изменяют внешнее состояние, выполнялись при разрушении конечного автомата ... и поместить их в выходное действие, если вы не хотите, чтобы они происходили в этом случае ...
Диаграмма состояний моделирует активацию как создание объекта, поэтому, если у вашего конструктора есть реальная работа / активация / создание экземпляра, и если он может потерпеть неудачу, так что состояние не может быть введено, Statechart поддерживает это, предоставляя вам возможность отобразить исключениена событие.Это обрабатывается способом, который обрабатывает иерархию состояний, ища внешнее состояние, которое обрабатывает событие исключения, аналогично тому, как стек должен был бы разматываться для модели вызовов на основе стека вызовов.
Это все хорошозадокументировано - я предлагаю вам прочитать документы и попробовать.Я предлагаю вам использовать деструкторы для очистки «программных ресурсов» и выходных действий для выполнения «реальных выходных действий».
Стоит отметить, что распространение исключений является проблемой во всех управляемых событиямисреды, а не только диаграммы состояний.Лучше всего рассуждать и включать ошибки / ошибки в свой дизайн диаграммы состояний, и тогда и только тогда, когда вы не можете их обработать, другим способом прибегайте к отображению исключений.По крайней мере, это работает для меня - ymmmv ....