Da war ich wohl in meinem letzten Artikel "Errors in Exceptions umwandeln" etwas voreilig. Durch einen Workaround, den ich ausversehen noch bei mir eingebaut hatte, wirkte es auf mich so, als wäre der Backtrace der ErrorException richtig. Dem ist aber leider nicht so. Nach wie vor beinhaltet der erste Eintrag die Zeile, in der die ErrorException geworfen wird.
Und wie ich in den Kommentaren im PHP-Manual gelesen habe (und auch selber nachvollziehen konnte), gibt es auch noch einen PHP-5.2-Bug in der ErrorException, welche die Argumente im Backtrace durcheinanderwürfelt. Und dieser kann leider erst mit PHP 5.3 behoben werden. Na, klasse.
Bevor ihr jetzt den Workaround aus den Manual-Comments einbaut, bei dem ihr auch noch ständig die PHP-Version überprüfen müsst, empfehle ich, die ExceptionError-Klasse selbst durch Erweiterung der Exception-Klasse zu bauen. Sollte recht schnell gehen, beinhaltet den Fehler nicht, und man könnte automatisch den ersten Eintrag aus dem Backtrace herauswerfen, um sich um keinen Sonderfall im Exception-Handler kümmern zu müssen.
PHP Bugs: #45895: Exception in set_error_handler() messes up backtrace args
Posts mit dem Label Exceptions werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Exceptions werden angezeigt. Alle Posts anzeigen
Sonntag, 30. November 2008
Dienstag, 25. November 2008
Errors in Exceptions umwandeln
Exceptions sind eine feine Sache. Sie kommen jedem faulen Programmierer entgegen, der keine Lust hat, jeden möglichen Fehlerfall einzeln abzuhandeln. Dumm nur, dass PHP-Funktionen aufgrund von Rückwarts-Kompatibilität immer noch Fehler statt Exceptions werfen.
Einer eher bekanntere Methode ist, einen Errorhandler zu schreiben, der nur die Aufgabe hat, eine Exception zu werfen. Das Problem: Der Backtrace, den man ja mit $e->getTrace() erhält, beginnt dummerweise mit der Zeile, in der die Exception geworfen wurde, und nicht mit der ders eigentliche Fehlers. Deshalb kann man dummerweise nicht den gleichen Top-Level-Exception-Handler verwenden, den man für Standard-Exceptions verwendet.
Eher unbekannt ist, dass es in PHP schon eine erweitere Exception namens ErrorException gibt. Mit folgendem simplen Code ist es problemlos möglich, Fehler auf Exceptions zu mappen:
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
Wer das ganze jetzt ein wenig aufmöbeln will, kann in diesem error handler jetzt noch den error_reporting Level abfragen, damit nur Fehler Exceptions werfen, die das auch wirklich sollen.
ErrorException im PHP Manual
Exceptions im PHP Manual
error_reporting() im PHP Manual
Einer eher bekanntere Methode ist, einen Errorhandler zu schreiben, der nur die Aufgabe hat, eine Exception zu werfen. Das Problem: Der Backtrace, den man ja mit $e->getTrace() erhält, beginnt dummerweise mit der Zeile, in der die Exception geworfen wurde, und nicht mit der ders eigentliche Fehlers. Deshalb kann man dummerweise nicht den gleichen Top-Level-Exception-Handler verwenden, den man für Standard-Exceptions verwendet.
Eher unbekannt ist, dass es in PHP schon eine erweitere Exception namens ErrorException gibt. Mit folgendem simplen Code ist es problemlos möglich, Fehler auf Exceptions zu mappen:
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
Wer das ganze jetzt ein wenig aufmöbeln will, kann in diesem error handler jetzt noch den error_reporting Level abfragen, damit nur Fehler Exceptions werfen, die das auch wirklich sollen.
ErrorException im PHP Manual
Exceptions im PHP Manual
error_reporting() im PHP Manual
Abonnieren
Posts (Atom)