Freaky Friday: Die Fehler, die wir manchmal machen

Heute gibt es dann endlich mal wieder etwas aus der Reihe Freaky Friday. Der mehr oder weniger regelmäßigen, freitaglichen Reihe kleiner Codeschnipsel. Die letzten Wochen war es mir leider nicht möglich freitags etwas zu schreiben. Aber nun kann es endlich weiter gehen.

In der objektorientierten Programmierung ist ein Objekt ein Objekt ein Objekt. So ist es eben auch in PHP. Ab PHP7 gibt es ein Throwable Interface, welches es ermöglicht Fatal Errors auch als Exceptions abfangen zu können. Solang PHP7 (momentan in der frühen Alpha 1 Version) noch nicht als stabiles Release verfügbar ist, möchte ich Euch zeigen, wie man Fatal Errors auch mit älteren PHP Versionen als Exceptions abfangen kann.

Ein Fatal Error führt in PHP immer zum Abbruch des Scripts, sofern das Error Reporting entsprechend eingestellt ist. In einer objektorientierten Umgebung kann dieses Verhalten unter Umständen nicht gewünscht sein. Mit der Funktion set_error_handler() kann man den PHP internen Error Handler einfach mit einem neuen ersetzen. Aber genug gesabbelt. Schaut Euch einfach mal folgendes Codebeispiel an:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function myErrorHandler($errorNumber, $errorMessage, $errorFile, $errorLine) {
    if (!(error_reporting() & $errorNumber)) {
        return;
    }
 
    $type = '';
    switch ($errorNumber) {
        case E_USER_ERROR || E_ERROR :
            $type = 'error';
            break;
 
        case E_USER_WARNING || E_WARNING :
            $type = 'warning';
            break;
 
        case E_USER_NOTICE || E_NOTICE :
            $type = 'notice';
            break;
 
        default :
            $type = 'unknown';
            break;
    }
 
    throw new \ErrorException('PHP ' . $type . ' in file ' . $errorFile . ' (' . $errorLine . '): ' . $errorMessage, 0);
}

Kurz erklärt, was diese Funktion macht. Diese Funktion nimmt alle Parameter einer normalen PHP Fehlermeldung entgegen und wertet diese aus. Ist das Error Reporting nicht entsprechend aufgedreht, liefert diese Funktion keinen Rückgabewert. Bei entsprechendem Error Reporting wird dann eine fangbare ErrorException geworfen, mit der man alles mögliche anstellen kann. Logging wäre hier zum Beispiel ein denkbares Szenario.

Hier noch mal ein kurzes Beispiel, wie man diese Funktion in der Praxis verwenden kann.

1
2
3
4
5
6
7
8
error_reporting(E_ALL);
set_error_handler('myErrorHandler');
 
try {
    explode();
} catch (\ErrorException $e) {
    echo $e->getMessage();
}

Was machen wir hier? Wir drehen das PHP Error Reporting voll auf, setzen die Funktion von gerade als Error Handler und rufen die Funktion explode() in einem try catch Block ohne Parameter auf. Logischerweise führt dies zu einem Fehler, der als ErrorException abgefangen und auf dem Bildschirm ausgegeben wird. Theoretisch hätte man den Fehler hier auch einfach in einem Error Log File speichern können. Das Script wäre in diesem Fall problemlos weiter gelaufen.

Habt ein tolles Wochenende! 😉

Bildnachweis: CC0 Public Domain / Pezibear (Pixabay)

About Author: Marcel
Ich bin Senior PHP Developer bei MM Newmedia. Seit 2005 bin ich begeisterter Webentwickler und arbeite als Freelancer für namenhafte Firmen und entwickle jede Menge abgefahrenes Zeug und berichte darüber in meinem Blog.

Kommentar verfassen