© fran_kies/Shutterstock.com
Effiziente Fehlerbehandlung selbst bei wachsender Komplexität

PHP Exceptions strukturieren


Es ist sehr schwierig, Lehrmaterial zum richtigen Umgang mit PHP Exceptions zu finden, das über die wesentlichen Grundlagen hinausgeht. Es sind sich zwar fast alle einig, dass man Exceptions nutzen sollte, doch wie man sie strukturiert und in einem größeren Projekt verwaltet, bleibt außen vor. Dabei ist es bei größeren Projekten umso wichtiger, gleich mit der richtigen Struktur anzufangen, um später ein teures Refactoring zu vermeiden. Wir untersuchen in diesem Artikel, wie man Exceptions optimal in PHP aufsetzt, nutzt und dabei die gröbsten Stolperfallen vermeidet.

Bevor wir Details in der Implementierung diskutieren, halte ich es für sinnvoll, die Hauptvorteile von Exceptions vorzustellen, wenn man sie mit trigger_error() oder auch der Rückgabe eines Fehlerobjekt vergleicht.

Warum überhaupt Exceptions nutzen?

Normale PHP-Fehler und -Warnungen kommen aus der prozeduralen Welt und bieten einen zentralen Mechanismus an, um diese Fehler abzuhandeln: eine Funktion oder Methode, die man als Fehlerbehandlungsroutine mittels set_error_handler() definiert. Man kann zwar unterschiedliche Behandlungsroutinen für unterschiedliche Fehlerstufen festlegen, aber ansonsten hat man keine weitere Möglichkeit, den genauen Punkt in der Ausführung zu bestimmen, an dem man die Fehler abhandeln möchte. Die Fehlerbehandlungsroutine liegt außerhalb des Kontexts des eigentlichen Ausführungsverlaufs. Somit ist es eher schwierig, den Fehler sinnvoll zu beheben oder abzuhandeln, wenn man erst einmal an diesem Punkt angelangt ist.

Exceptions hingegen können an jedem beliebigen Punkt im Quellcode abgehandelt werden. Und da sie über eine Art Eskalation durch die einzelnen Layer in der Applikation wandern, kann man für jede Exception entscheiden, in welchem Layer und in welchem Kontext man sie abhandeln möchte. Dies ermöglicht es, Exceptions direkt in dem aufrufenden Code zu behandeln, wenn das Sinn ergibt, oder sie bis an die Oberfläche durchlaufen zu lassen, wenn das nicht der Fall ist. Ruft der Code einen Eintrag aus der Datenbank ab und wirft zum Beispiel eine Exception, kann das auf nuancierte Weise und je nach Typ der Exception angegangen werden. Konnte die Datenbank kein Resultat liefern, weil die angeforderte ID nicht bekannt ist, kann eventuell ein NullObject zurückgeben werden, statt einen Fehler zu generieren. Das lässt den User weiter mit dem System arbeiten, ohne dass der Server einen fatalen Fehler wiedergibt. Konnte hingegen die Verbindung zur Datenbank nicht aufgebaut w...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang