am 4. August 2009
Kater von gestern überstanden? Ja? Dann kann es ja weiter gehen … Man lernt nie aus. Diese These hatte ich ja glaube ich schon mal aufgestellt, aber heute wurde sie mal wieder bestätigt. Ich kam heute endlich mal wieder zum Programmieren und wie das nun mal ist, passieren da die komischsten Dinge. Heute hat mein Programm auf einmal gestreikt und ich hatte keine Ahnung warum. Viel geändert seit dem letzen F5 hatte ich nämlich nicht.
Die Fehlermeldung, die kam konnte ich auch nicht so recht interpretieren. Fatal error: Exception thrown without a stack frame in Unknown on line 0. Nachdem ich weiß, warum dieser Fehler auftrat, weiß ich auch, warum ich sie nicht interpretieren konnte. Sie macht keinen Sinn! Seid mal ehrlich, was würdet ihr denken, wenn auch euer Programm so um die Ohren fliegt? Ich hoffe mal ein großes Häääää?!? Zumindest ging es mir so. Was macht man in so einem Fall? Google fragen. Hat nicht lange gedauert, da wusste ich die Lösung.
PHP gibt diesen Laut von sich, falls man versucht eine Exception im Destruktor zu werfen. Ich war mir zu dem Zeitpunkt noch gar nicht wirklich bewusst, dass ich das mache, aber eine von den Methoden, die ich verwendet habe, hat dies leider getan und ich habe sie nicht rechtzeitig gefangen. Die Fehlermeldung ist ein klares WTF. Dass PHP so eine Exception nicht zulässt ist vielleicht gar nicht so verkehrt. Hier aber erstmal schnell ein Beispiel, damit ihr es zuhause auch probieren könnt.
class MyClass {
function __destruct(){
throw new Exception('fail');
}
}
$n = new MyClass();
Aber warum zum Teufel sollte ich keine Exceptions werfen können? Meine Theorie ist, es macht keinen Sinn. Der Destruktor wird vom Garbage Collector aufgerufen. Wann dies passiert, ist allein PHP überlassen (zumindest in den meisten Fällen). Ich kann zwar ein unset auf das Objekt machen, aber ob es dann in dem Augenblick auch vom GC in den Müll geworfen wird ist fraglich. Wie soll ich also diese Exception fangen, wenn ich nicht weiß, wo sie geworfen wird. Ein Handling dieser Ausnahme ist also nicht möglich. Ich muss dazusagen, dass ich mir nicht sicher bin, ob ich die PHP Internals genau genug kenne, um diese Theorie zu halten, aber vielleicht kennt ja jemand von euch die wahren Gründe. Könnte mir auch vorstellen, dass PHP da einfach beim Ausführen abschmiert und deswegen diese fiese Fehlermeldung kommt, da es aber nicht verkehrt ist, dass man mit dem Programm aufhört, hat man es gelassen.
Ich bin mir auch gar nicht so sicher, ob PHP 5.3 mit dem gleichen Fehler rausknallt. Irgendwo habe ich was gelesen, dass sich da was verändert hat.