Exceptionbehandlung

Bitte beachten Sie, dass die hier beschriebene Dokumentation bis einschließlich Release 1.14 gilt. Die Dokumentation für Releases nach 1.14 finden Sie unter Exception-Behandlung.

1. Einleitung

Zur globalen Exceptionbehandlung nutzt das Framework die Funktion exceptionHandler. Diese hat die Aufgabe, alle nicht abgefangenen Exceptions an zentraler Stelle zu behandeln. Zu diesem Zweck nutzt die Funktion eine ExceptionHandler-Komponente, die über die Registry konfigurierbar ist. Letztere ist dann für die eigentliche Behandlung einer Exception verantwortlich. Der Mechanismus ähnelt der im Framework integrierten Fehlerbehandlung.

Die im APF vorkonfigurierte Exceptionbehandlung beinhaltet dabei die Speicherung der Meldung in einer Log-Datei und die Ausgabe der nicht abgefangenen Exception inklusive des Stacktraces. Details können der API-Dokumentation der Klasse DefaultExceptionHandler entnommen werden.

2. Konfiguration

Um den vorkonfigurierten DefaultExceptionHandler durch einen eigenen zu ersetzen muss der Registry-Offset ExceptionHandler im Namespace apf::core mit der gewünschten ExceptionHandlerDefinition ersetzt werden. Die Konfiguration einer eigenen Exceptionbehandlungsroutine muss dabei in der Bootstrap-Datei nach dem Einbinden der pagecontroller.php erfolgen.

Die Definition einer eigenen Exception-Behandlungskomponente gestaltet sich wie folgt:

PHP-Code
Registry::register( 'apf::core', 'ExceptionHandler', new ExceptionHandlerDefinition( 'my::exceptionhandler::namespace', 'MyExceptionHandler' ) );

Wie aus dem Code-Beispiel zu erkennen ist, wird ein ExceptionHandler durch seinen Namespace und seinen Klassennamen referenziert.

Enthält der Registry-Offset keine gültige Definition, werden auftretende Exceptions in Text-Form ausgegeben. Der Fallback-Modus ist daran zu erkennen, dass die Meldung mit
APF-Template
APF catchable exception:
beginnt. In diesem Fall muss die Definition oder die Implementierung der ExceptionHandler-Klasse überprüft werden.
Um den ExceptionHandler zu deaktivieren kann der Registry-Eintrag mit null initialisiert werden.

3. Erweiterung

Um eine eigene Exceptionbehandlung einzuführen, muss die Klasse AbstractExceptionHandler implementiert werden. Diese definiert folgendes Interface:

PHP-Code
abstract class AbstractExceptionHandler extends APFObject { public function handleException($exception){ } }

Bei Auftreten einer Exception wird der Methode handleException das Exception-Objekt übergeben. Da die Exceptionbehandlung in einer eigenen Klasse stattfindet, die nicht mit dem ServiceManager erzeugt wurde, steht der Zugriff auf den aktuellen Context und die aktuelle Sprache nicht zur Verfügung!

Sollten diese Informationen für die Behandlung der Exception notwendig sein, müssen diese über in einer Applikation verfügbaren Informationscontainer (z.B. Model-Klasse eines Modules) bezogen werden. Der Umgebungsparameter steht wie in der Dokumentation beschrieben über die Registry zur Verfügung.

4. Anwendung

Der globale Exception-Behandlungsmechanismus kann einfach durch folgenden PHP-Code genutzt werden:

PHP-Code
throw new Exception('My application exception');

Vorraussetzung dabei ist, dass die durch den Code geworfene Exception nicht durch ein try-catch-Konstrukt abgefangen wird!

Details können der Online-Dokumentation unter http://php.net/exception und http://php.net/exceptions entnommen werden.

5. Live ExceptionHandler

Analog zum ProductionErrorHandler wird seit dem Release 1.13 auch ein ExceptionHandler für den Live-Betrieb ausgeliefert.

Nach dem Einbinden der pagecontroller.php kann der ProductionExceptionHandler wir folgt konfiguriert werden:

PHP-Code
Registry::register( 'apf::core', 'ExceptionHandler', new ExceptionHandlerDefinition( 'core::exceptionhandler', 'ProductionExceptionHandler' ) ); Registry::register( 'apf::core::exceptionhandler', 'ProductionExceptionRedirectUrl', '/pages/global-error' );

Wird die Registry-Direktive ProductionExceptionRedirectUrl nicht gesetzt, leitet der ExceptionHandler nach "/" weiter.

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.
« 1   »
Einträge/Seite: | 5 | 10 | 15 | 20 |
1
Christian 18.09.2011, 22:51:06
Hallo Werner,

ein entsprechender Hinweis und ein Code-Beispiel habe ich ergänzt. Danke für den Hinweis!
2
werner 25.08.2011, 20:43:38
In der Doku fehlt ein hinweis wie man den RedirectUrl setzten kann.

Registry::register(\'apf::core::exceptionhandler\', \'ProductionExceptionRedirectUrl\', \'/sitemap.xml\');