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

    2 Kommentare:

    1. [...] 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öschen
    2. 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.

      AntwortenLöschen