Fehlerbehandlung

1. Einleitung

Das APF bringt im Auslieferungszustand eine eigene, globale Fehler-Bahandlung mit. Diese setzt auf dem in PHP enthaltenen Mechanism auf und zeigt eine Fehlerseite an, die alle Parameter des Fehlers sowie einen Stacktrace anzeigt.

Die Architektur der APF-Fehlerbehandlung basiert auf einem zentralen Anlaufpunkt (GlobalErrorHandler), der die konkreten Fehler annimmt und an einen registrierten ErrorHandler weiter gibt. Das Interface ErrorHandler besitzt mehrere Standard-Implementierungen (siehe unten) und kann jederzeit dazu genutzt werden, Implementierungen für den eigenen Anwendungsfall zu schaffen.

2. Konfiguration

2.1. Eigener ErrorHandler

Der GlobalErrorHandler ist im Auslieferungszustand des APF bereits aktiviert. Als Standard-Handler ist der DefaultErrorHandler registriert.

Um den vorkonfigurierten Zustand durch einen eigenen zu ersetzen kann folgender Code nach dem Einbinden der pagecontroller.php genutzt werden:

PHP-Code
import('my::project', 'CustomErrorHandler'); GlobalErrorHandler::registerErrorHandler(new CustomErrorHandler());

Sofern notwendig, können Sie der Instanz des ErrorHandler beliebige Informationen (z.B. Context) mitgeben.

2.2. Aktivierung und Deaktivierung

Soll der APF-Mechamismus deaktiviert oder nach einer Deaktivierung wieder aktiviert werden, so können Sie dies mit Hilfe des GlobalErrorHandler sehr einfach nach dem Einbinden der pagecontroller.php erledigen:

PHP-Code
// Deaktivieren der APF Fehlerbehandlung GlobalErrorHandler::disable(); // Erneute Aktivierung der APF Fehlerbehandlung GlobalErrorHandler::enable();

3. Implementierung eines ErrorHandler

Um eine eigene Fehlerbehandlung einzuführen, muss das Interface ErrorHandler implementiert werden. Diese definiert die folgende Methode:

PHP-Code
interface ErrorHandler { public function handleError( $errorNumber, $errorMessage, $errorFile, $errorLine, array $errorContext); }

Bei Auftreten eines Fehlers werden der Methode handleError() die Parameter

  • Fehler-Nummer
  • Fehler-Meldung
  • Datei, in der der Fehler auftritt
  • Zeile, in der der Fehler auftritt
  • Variable-Scope während des Fehlers

übergeben.

Da die Fehlerbehandlung in einer eigenen Klasse (z.B. DefaultErrorHandler) stattfindet, die nicht mit dem ServiceManager erzeugt wurde, steht der Zugriff auf den aktuellen Context und die aktuelle Sprache nicht zur Verfügung!

Werden diese Informationen benötigt, können Sie Ihrer Implementierung beliebige Attribute über den Konstruktor oder getter-Methoden mitgeben. Beispiel:

PHP-Code
class CustomErrorHandler implements ErrorHandler { private $context; public function __construct($context) { $this->context = $context; } public function handleError($errorNumber, $errorMessage, $errorFile, $errorLine, array $errorContext) { ... } } GlobalErrorHandler::registerErrorHandler(new CustomErrorHandler('foo'));

Als Implementierungsbeispiele für eigene ErrorHandler können Sie die Klassen DefaultErrorHandler, ConfigurableErrorHandler und ProductionErrorHandler heranziehen.

4. Anwendung

Der globale Fehler-Behandlungsmechanismus kann einfach durch Aufrufen der PHP-Funktion

PHP-Code
trigger_error();

genutzt werden. Details können der Online-Dokumentation unter http://php.net/trigger_error entnommen werden.

5. Verfügbare ErrorHandler

Das APF bringt zwei weitere ErrorHandler-Implementierungen mit, die für den Einsatz in Live-Umgebungen empfohlen werden. Live-Systeme gilt es im besonderen vor Kompromittierung zu schützen. Daher sind der ProductionErrorHandler und ConfigurableErrorHandler dafür ausgelegt, möglichst die bei einem Fehler gesammelten Daten vor dem potentiellen Angreifer zu verstecken.

5.1. ProductionErrorHandler

Tritt ein Fehler auf, fügt der ProductionErrorHandler diesen an die globale Log-Datei an und leitet auf eine zuvor konfigurierte Seite weiter. Damit schützt er vor der Veröffentlichung von Daten, die zum Zeitpunkt des Fehlers gesammelt wurden.

Die Konfiguration kann nach Einbinden der Datei pagecontroller.php wie folgt vorgenommen werden:

PHP-Code
import('core::errorhandler', 'ProductionErrorHandler'); GlobalErrorHandler::registerErrorHandler( new ProductionErrorHandler('/pages/global-error') );

Das Konstruktor-Argument definiert diejenige Url zu der der Benutzer im Falle eines Fehlers weitergeleitet wird.

Bitte stellen Sie sicher, dass die Fehlerseite keine weiteren Fehler produziert. Andernfalls erzeugen Sie dadurch eine Umleitungsschleife, die keine Abbruchbedingung besitzt!

5.2. ConfigurableErrorHandler

Der ConfigurableErrorHandler ermöglicht es, Fehler unter einem gewissen Level getrennt zu behandeln. Hierzu kann über ein Konstruktor-Argument ein Level fest gelegt werden unterhalb dessen der ErrorHandler den Fehler ignoriert. Ist dieser Level überschritten, verhält er sich wie der DefaultErrorHandler.

Die Einbindung des ConfigurableErrorHandler gestaltet nach Einbinden der Datei pagecontroller.php wie folgt:

PHP-Code
import('core::errorhandler', 'ConfigurableErrorHandler'); GlobalErrorHandler::registerErrorHandler( new ConfigurableErrorHandler(E_ALL ^ E_NOTICE) );

Mit der gewählten Konfiguration werden alle Fehler ausser E_NOTICE-Fehler behandelt. Details zur Konfiguration von Fehler-Leveln kann der PHP-Dokumentation entnommen werden.

Kommentare

Möchten Sie den Artikel eine Anmerkung hinzufügen, oder haben Sie ergänzende Hinweise? Dann können Sie diese hier einfügen. Die bereits verfassten Anmerkungen und Kommentare finden Sie in der untenstehenden Liste.
Für diesen Artikel liegen aktuell keine Kommentare vor.