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