PHP-Fehlerbehandlung

Exception gegen Error-Code

PHP stellt mit der Fehlerbehandlung über Errors ein Möglichkeit dar, auf Fehler zu reagieren. Im Framework wird allerdings in den meisten Fällen, besonders wenn es um die Arbeit mit Ressourcen geht Exception geworfen, anstatt einen Error-Code zurückzugeben.

Die Entscheidung muß je nach Klasse und Methode neu getroffen werden und gut abgewogen werden. Der große Vorteil der Verwendung von Exception im Framework ist wie auch z.B. Herb Sutter meint:

Exceptions können Fehler innerhalb des Codes an jeder Stelle (auch in einem Konstruktor) melden. Im Konstruktor können z.B. keine Error-Code zurückgegeben werden.

Exceptions können nicht ignoriert werden. Ein Error-Code muss explizit abgefangen und geprüft werden, eine Exception macht sich immer bemerkbar.

Die Klasse ErrorHandler

Leider ist das Handling von PHP-Fehlern nicht trivial. Aus diesem Grund und zur Vereinheitlichung der Fehlerbehandlung bietet Alvine mit der Klasse \Alvine\Core\ErrorHandler eine Möglichkeit zur Verfügung, Errors in Exceptions umzuwandeln. Alvine hängt sich dafür in die PHP-Fehlerbearbeitung ein und wirft im Falle eines Auftretenden PHP-Fehlers eine \Alvine\Core\ErrorException. Die weitere Behandlung muss dann vom Skript übernommen werden.

/**
 * Error-Handler registrieren
 */
$errorHandler = \Alvine\Util\Error\PHPHandler::getInstance();
$errorHandler->register();

/**
 * Systemfehler auslösen.
 */
trigger_error('FEHLER!');

Will man im Skript auf einen Fehler reagieren, so kann man das über einen try-Block abfangen. Allerdings funktioniert das nicht bei PHP-Fehlern. Das folgende Beispiel wird mit einem PHP-Fehler beendet.

try {
  trigger_error('FEHLER!');
} catch(Exception $e) {
  // Behandlung der Exception
}

Hier kann die Klasse \Alvine\Core\ErrorHandler eingesetzt werden und den Aufruf der PHP Funktion kapseln

try {
    Alvine\Util\Error\PHPHandler::execute('\Alvine\Core\FrameworkException', function() {
       @trigger_error('FEHLER!');
    });
} catch(Exception $e) {
    echo 'Exception: '.$e->getMessage();
    // Ergebnis -> Exception: E_USER_NOTICE. Error message was "FEHLER!" in file example.php
}