議論への Tim の遅れたエントリへの回答 (これは、Lev からの非常に初期のコメントの 1 つにも対応しています)。
ステートチャートでデストラクタから exit を分離することを主張した人の 1 人として (実際のユースケースに基づく議論、現実世界との相互作用、つまり I/O について) ずっと前に Boost に提出されたとき、exit を配置する際に問題がある可能性があることに同意します。デストラクタのロジック。当然のことながら、David Abrahams は、例外の安全性に関しても説得力のある議論を行いました。これらの理由から、Statechart では、ロジックをデストラクタに入れる必要はありませんが、通常のアドバイスに従ってデストラクタに入れることができます。
状態からの遷移の一部としてのみ実行する必要がある (statechart オブジェクト全体の破棄ではない) ロジックは、個別の exit() アクションに分離できます (実行するリソースのクリーンアップもある場合は実行する必要があります)。
アクティブな状態 (リソース) がなく、実行するエントリ/終了アクションのみの「薄い」状態の場合、ctor と d'tor でこれらのアクションを実行し、コンストラクタとデストラクタがスローしないようにすることができます。それらに理由はありません - RAII を実行する状態はありません - これらの場所でのエラー処理が適切なイベントを発生させることに悪はありません。ただし、外部状態を変更する終了アクションをステートマシンの破壊で実行するかどうかを検討する必要がある場合があります...そして、この場合に発生させたくない場合は、それらを終了アクションに入れます...
ステートチャートはアクティベーションをオブジェクトのインスタンス化としてモデル化するため、コンストラクターが実行する実際の作業/アクティベーション/インスタンス化があり、状態に入ることができないほど失敗する可能性がある場合、ステートチャートは、例外をオブジェクトにマップする機能を提供することでそれをサポートします。イベント。これは、例外イベントを処理する外部状態を探して状態階層を処理する方法で処理されます。これは、コール スタック ベースの呼び出しモデルでスタックが巻き戻される方法と似ています。
これはすべて十分に文書化されています - ドキュメントを読んで試してみることをお勧めします。デストラクタを使用して「ソフトウェア リソース」をクリーンアップし、終了アクションを実行して「実際の終了アクション」を実行することをお勧めします。
例外の伝播は、ステートチャートだけでなく、すべてのイベント ドリブン環境で少し問題になることに注意してください。フォールト/エラーについて推論し、ステートチャートの設計に含めることをお勧めします。別の方法でそれらを処理できない場合にのみ、例外マッピングに頼ります。少なくともそれは私にとってはうまくいきます-ymmmv ....