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
}