Webworking und Wakeboarding
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.
Dieses ist die Gehirnaussonderung eines Hamburger Webworkers, der ab und zu auch gern mal mit dem Wakeboard durch die Wellen pflügt.
Errors in Exceptions umwandeln (2) - Webboarder
30. November 2008 um 13:26 Uhr
[...] war ich wohl in meinem letzten Artikel “Errors in Exceptions umwandeln” etwas voreilig. Durch einen Workaround, den ich ausversehen noch bei mir eingebaut hatte, [...]
maz
14. Dezember 2008 um 13:27 Uhr
Die eigene Error-Handler-Funktion sollte noch um ein if (error_reporting()) { throw … } ergänzt werden, damit keine Exception geworfen wird, wenn die “@ error suppression directive” verwendet wird.