Als Antwort auf Tims späten Eintritt in die Diskussion (der auch einen der sehr frühen Kommentare von Lev anspricht).
Als einer derjenigen, die sich vor langer Zeit bei der Übermittlung an Boost für die Trennung von Destruktoren im Statechart (Argument basierend auf einem realen Anwendungsfall, über die Interaktion mit der realen Welt, dh E / A) ausgesprochen haben, stimme ich zu, dass es Probleme geben kann, den Exit zu setzen Logik in Destruktoren. Es überrascht nicht, dass David Abrahams auch in Bezug auf die Ausnahmesicherheit überzeugende Argumente vorbrachte. Aus diesen Gründen verlangt Statechart nicht, dass Sie Logik in Destruktoren einfügen - aber es erlaubt Ihnen - mit den üblichen Ratschlägen.
Logik, die immer nur als Teil eines Übergangs aus einem Zustand ausgeführt werden sollte (nicht Zerstörung des gesamten Zustandsdiagrammobjekts), kann (und sollte, wenn auch eine Ressourcenbereinigung durchgeführt werden muss) in eine separate exit () -Aktion unterteilt werden.
Für einen "dünnen" Zustand ohne aktiven Zustand (Ressourcen), nur Ein- / Ausstiegsaktionen, können Sie diese Aktionen in ctor und d'tor ausführen und sicherstellen, dass der Konstruktor und der Destruktor nicht werfen. Es gibt keinen Grund für sie - es gibt keinen Zustand, an dem RAII durchgeführt werden kann - es ist nicht böse, wenn die Fehlerbehandlung an diesen Orten geeignete Ereignisse auslöst. Möglicherweise müssen Sie noch überlegen, ob Exit-Aktionen, die den externen Status ändern, bei Zerstörung der Zustandsmaschine ausgeführt werden sollen ... und sie in die Exit-Aktion setzen, wenn Sie in diesem Fall nicht möchten, dass sie ausgeführt werden ...
Statechart modelliert die Aktivierung als Instanziierung eines Objekts. Wenn Ihr Konstruktor also echte Arbeit / Aktivierung / Instanziierung zu erledigen hat und wenn dies fehlschlagen kann, sodass der Status nicht eingegeben werden kann, unterstützt Statechart dies, indem Sie eine Ausnahme einem zuordnen können Veranstaltung. Dies wird so gehandhabt, dass die Statushierarchie nach einem äußeren Zustand sucht, der das Ausnahmeereignis behandelt, analog zu der Art und Weise, wie der Stapel für ein auf einem Aufrufstapel basierendes Aufrufmodell abgewickelt worden wäre.
Dies ist alles gut dokumentiert - ich schlage vor, Sie lesen die Dokumente und versuchen es. Ich schlage vor, dass Sie Destruktoren verwenden, um "Softwareressourcen" zu bereinigen und Aktionen zu beenden, um "reale Exit-Aktionen" auszuführen.
Es ist anzumerken, dass die Weitergabe von Ausnahmen in allen ereignisgesteuerten Umgebungen ein Problem darstellt, nicht nur in Zustandsdiagrammen. Es ist am besten, Fehler zu begründen und in Ihr Statechart-Design aufzunehmen, und wenn und nur wenn Sie sie nicht auf andere Weise behandeln können, greifen Sie auf die Ausnahmezuordnung zurück. Zumindest funktioniert das bei mir - ymmmv ....