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.
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:
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.
APF catchable exception:Um eine eigene Exceptionbehandlung einzuführen, muss die Klasse AbstractExceptionHandler implementiert werden. Diese definiert folgendes Interface:
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.
Der globale Exception-Behandlungsmechanismus kann einfach durch folgenden PHP-Code genutzt werden:
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.
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:
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.
Die Entwicklung des APF wird von JetBRAINS mit PHPStorm-Lizenzen unterstützt und wir sind überzeugt davon, dass PHPStorm die Qualität nachhaltig steigert. Benutzen auch Sie PHPStorm!
Proud to useIntelligent PHP IDE for coding, testing and debugging with pleasure