Es erscheint zwar vielleicht im ersten Augenblick merkwürdig, dass ein
die in einem Destruktor keinen Programmabbruch bewirkt, aber andererseits sollte man sich ein paar Dinge in Erinnerung rufen:
- Ein Destruktor hat den Zweck, externe Resourcen freizugeben oder andere Managementaufgaben am Ende der Lebensdauer eines Objektes wahrzunehmen, die nicht voll automatisch erledigt werden können.
- Es ist nicht klar, wann und in welchem Kontext ein Destruktor aufgerufen wird. Das einzige was feststeht ist, dass er aufgerufen wird, wenn das Objekt zu dem er gehört nicht mehr referenziert wird.
- die ist keine Methode um ein Programm unkonditionell abzubrechen sondern kann auf verschiedene Arten abgefangen werden.
Das bedeutet aber:
- Ein Destruktor muss immer irgendwie erfolgreich ablaufen können, wenn das Programm nicht in einen inkonsistenten Zustand geraten oder Resourcen lecken soll.
- Die Hierarchie von Fehlerbehandlungsroutinen um den Aufruf eines Destruktors herum ist unklar. Ein normal ausgeführtes die würde vielleicht irgendeinen völlig unkorrelierten eval-Block mit der Fehlermeldung des Destruktors belästigen und so ebenfalls Verwirrung im Programm stiften.
- Ein Destruktor muss in jedem dynamischen Kontext lauffähig sein, denn der Programmierer hat keine volle Kontrolle darüber wo er aufgerufen wird. Es mag durchaus sein, dass zum Zeitpunkt des Destruktoraufrufes die ohnehin nicht fatal ist.
Für Code der in jedem beliebigen Umfeld korrekt ablaufen soll, und der eigentlich gar nicht fehlschlagen darf, wenn nicht überall die Hölle losbrechen soll, ist das Verhalten das Perl hier an den Tag legt ziemlich sinnvoll. Im übrigen deckt es sich auch mit dem anderer Sprachen wie zum Beispiel Java.
Sollte ein Destruktor wirklich feststellen, dass das Aufräumen des Objektes unmöglich ist und folglich das Programm ziemlich sicher nicht mehr in einen definierten Zustand zu bringen ist, dann ergibt es auch Sinn, wenn er härtere Maßnahmen als
die ergreift, um einen Programmabbruch zu erzwingen.
When C++ is your hammer, every problem looks like your thumb.