У відповідь на запізнення Тима до дискусії (яка також стосується одного з дуже ранніх коментарів Лева).
Оскільки один з тих, хто стверджував, що вихід є відокремленим від деструкторів у державному діаграмі (аргумент, що базується на справжньому випадку використання, про взаємодію з реальним світом, тобто введення-виведення), зворотній час, коли він був поданий в Boost, я погоджуюсь, що можуть виникнути проблеми із встановленням виходу логіка в деструкторах. Девід Абрахамс також не дивно висловив переконливі аргументи щодо безпеки виключень. З цих причин Statechart не вимагає від вас логіки в деструкторах - але це дозволяє - за допомогою звичайних порад.
Логіка, яка повинна коли-небудь виконуватись як частина переходу зі стану (а не знищення об'єкта діаграми statechart в цілому), може бути (і повинна, якщо є також очищення ресурсів), відокремитись в окрему дію exit ().
Для "тонкого" стану без активного стану (ресурсів), просто виконуючи дії входу / виходу, ви можете виконати ці дії в ctor і d'tor і переконатися, що конструктор і деструктор не кидаються. Для них немає ніякої причини - немає держави, щоб виконувати RAII далі - немає зла в тому, щоб обробка помилок у цих місцях викликала відповідні події. Можливо, вам все ж доведеться розглянути питання про те, чи хочете дії виходу, які змінюють зовнішній стан, на запуск руйнування машинної машини, і ... і ввести їх у дію виходу, якщо ви не хочете, щоб вони відбувалися в цьому випадку ...
Statechart моделює активацію як екземпляр об'єкта, тому якщо у вашого конструктора є справжня робота / активація / інстанція, і якщо він не може вийти з ладу, такий стан не можна вводити. подія. Це обробляється таким чином, що розробляє ієрархію стану, шукаючи зовнішній стан, який обробляє подію винятку, аналогічно тому, як стек мав би розмотуватися для моделі виклику на основі стека викликів.
Це все добре задокументовано - я пропоную прочитати документи та спробувати. Я пропоную використовувати деструктори для очищення "програмних ресурсів" та виходу з дій для виконання "дій з виходу з реального світу".
Варто зазначити, що поширення винятків є проблемою у всіх середовищах, керованих подіями, а не лише у державних закладах. Найкраще обґрунтувати та включити несправності / помилки у свій дизайн діаграми стану, і якщо і лише тоді, коли ви не можете впоратися з ними іншим способом, вдайтеся до відображення виключень. Принаймні, це працює для мене - ymmmv….