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
[...] war ich wohl in meinem letzten Artikel “Errors in Exceptions umwandeln” etwas voreilig. Durch einen Workaround, den ich ausversehen noch bei mir eingebaut hatte, [...]
AntwortenLöschenDie 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.
AntwortenLöschen