Unterschiedliche Behandlung in einem Destruktor, wenn eine Exception ausgeführt wird.
-
Ich habe relativ komplexe Routinen und Memberfunktionen, die auch Exceptions werfen.
Jetzt würde ich gerne ein Objekt erzeugen, dass sich bei Auftreten einer Exception im Destruktor anders verhält.
Klar kann ich so etwas bauen
void foo() { CMyObject object; try { // Do complex things that throw ... } catch (...) { // Set a flag that the destructor behaves different object.ExceptionHappened(); throw; } }
Ich hätte gerne, dass mein Objekt selber weiß, wann es eine Exception gegeben hat.
void foo() { CMyObject object; // Do complex things that throw ... // Destructor of CMyObject will behave according exception or no exception }
-
Manchmal sollte man länger Suchen bevor man was schreibt:
https://en.cppreference.com/w/cpp/error/uncaught_exceptionSehr interessant dazu ist das hier:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4152.pdf
-
@martin-richter sagte in Unterschiedliche Behandlung in einem Destruktor, wenn eine Exception ausgeführt wird.:
Sehr interessant dazu ist das hier:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4152.pdfOha, tatsächlich sehr interessant! Zuerst dachte ich, dass ich so ein Problem bisher noch nicht hatte. Die Beispiele in dem Proposal haben mir aber gezeigt, dass ich es bloss nur nicht wusste, dass ich dieses Problem hatte.
Transaction
-ähnliche Klassen habe ich tatsächlich schonmal umgesetzt und mir dabei datenbankmäßig immer mit einercommit()
-Methode beholfen, die am Ende aufgerufen wird. Das ist im Prinzip das selbe wie deinobject.ExceptionHappened()
nur eben bei Erfolg und nicht bei Fehler. Danke für die Info, mitstd::uncaught_exceptions()
lassen sich in C++17 solche Klassen jetzt offenbar so schreiben, dass sich dascommit()
automatisieren lässt - eine Sache weniger, bei der man nach langem Debuggen feststellen muss, dass man sie irgendwo vergessen hat