Keine Exception im Destructor werfen. Warum?
-
Hallo liebes Forum,
ich habe jetzt einige Artikel darüber gelesen, dass man keine
Exception im Desctructor werfen soll. Es gibt aber eine Ausnahme, wenn
keine andere Exception in Behandlung ist.
Mein Problem ist, ich verstehe einfach nicht warum.
Wenn mir einer nochmal alles mit seinen Worten erklären könnte wäre
das super nett. Ich bin momentan einfach nur verwirrt.Hoffe auf Antwort
-
-
Kurz und bündig: Es darf keine Exception geworfen werden wenn gerade eine Exception behandelt wird. Destruktoren werden "zwischen" throw und catch abgearbeitet, also während eine Exception behandelt wird.
-
genauer gesagt: während des stack-unwindings darfst du keine exception werfen, da sonst
std::terminate
aufgerufen wird. d.h. du darfst auch keine exception in einer beliebigen funktion werfen, wenn diese vom destruktor aufgerufen wird. oder noch genauer: du darfst sie nicht durchlassen.
du kannst auch zwei (oder mehrere) aktive exceptions in deinem programm haben, d.h. du kannst auch - sicher - exceptions werfen, obwohlstd::uncaught_exception
true
liefert.
du musst sie nur rechtzeitig fangen.deshalb ist die standardvorgehensweise in dem fall, dass ein destruktor fehlschlagen könnte, seinen code auszulagern (in eine
close
-funktion) und ihn im destruktor mit einem try-catch block zu umschließen.
-
was ist stack-unwinding?
-
Warum musst du für eine Frage, die sich trivial googeln lässt, 6 Jahre alte Threads ausgraben?
-
wernerschwarz schrieb:
was ist stack-unwinding?
non-local goto mit Destruktoraufruf