OOP in PHP – Teil 12: Exceptions

Egal wie sehr wir beim entwickeln aufpassen, egal wie gut wir programmieren und wie viel Erfahrung wir haben: Es wird immer wieder die Situation aufkommen, dass Fehler in unserem Code passieren. Sei es unsere Schuld, eine falsche Usereingabe auf der Website oder möglicherweise eine böswillige Attacke auf unsere Seite. Fehler sind kein Problem, wir müssen uns allerdings darum kümmern, wie wir mit ihnen umgehen.

Was ist eine Exception?

Eine Exception (engl. Ausnahme) ist ein Sprachkonstrukt in vielen Programmiersprachen. Diese kann geworfen (throw) und gefangen (catch) werden. Rechnen wir in einem gewissen Codeabschnitt also mit einem Fehler (zum Beispiel bei der Verarbeitung von Daten, die der User eingegeben hat oder vielleicht der Verarbeitung einer hochgeladenen Datei) können wir eine Fehlerbehandlung einbauen.
Tritt ein Fehler auf (beispielsweise die hochgeladene Datei ist leer) können wir nun eine Exception werfen und diese wird in einem gesonderten Teil aufgefangen und darauf reagiert. Tritt kein Fehler auf wird dieser gesonderte Teil einfach übersprungen.

Doch es gibt noch eine weitere wichtige Besonderheit. Jeglicher Code nach dem Werfen der Exception bis zur Fehlerbehandlung wird übersprungen und nicht ausgeführt. Schauen wir uns das mal an einem Beispiel an.

 

Wie kann ich Exceptions abfangen?

Führen wir dieses Beispiel aus sehen wir, dass nur die erste Ausgabe und die Ausgabe innerhalb des catch Blocks stattfindet. Der komplette try Block wird also mit dem Werfen einer Exception abgebrochen. Sollte die Exception innerhalb einer Funktion geworfen werden, die im try Block aufgerufen wird, wird auch die Funktion sofort mit dem Werfen beendet.

 

 

Die Fehlerbehandlung mit Exceptions hat dementsprechend nur drei wichtige Teile:

  1. Ein try Block. In jedem Programm kann es natürlich beliebig viele try Blöcke geben, schließlich können Exceptions an verschiedenen Stellen im Code unterschiedlich behandelt werden.
  2. Den Wurf einer Exception mit dem Schlüsselwort throw innerhalb eines try Blocks. Der komplette try Block wird mit dem Wurf einer Exception abgebrochen. Beim Werfen der Exception können wir eine Message und optional eine Fehlernummer als Parameter mitgeben.
  3. Beliebig viele catch Blöcke. Je nach Typ der Exception (dazu kommen wir gleich) kann unterschiedlich auf einen Fehler reagiert werden. Schließlich möchten wir zum Beispiel falls ein Datensatz nicht gefunden wird anders reagieren als wenn eine hochgeladene Datei einen Virus enthält (krass ausgedrückt).

Sehen wir uns zuerst ein Beispiel mit mehreren catch Blöcken an.

Wie wir sehen ist es ganz einfach, auf verschiedene Exceptions zu reagieren. Innerhalb des catch Blocks steht uns dann das Exception Objekt (im Beispiel $e genannt, kann jedoch auch anders heißen) zur Verfügung. Wie wir eigene Exceptiontypen festlegen beleuchten wir im nächsten Abschnitt ganz genau.

Try- und catch Blöcke können auch verschachtelt werden. Beim Werfen einer Exception springt der Code direkt an die erste Stelle an der die gesuchte Exception gefangen wird. Dies kann für etwas Verwirrung sorgen, man sollte also bei den Exceptiontypen sehr vorsichtig sein.

Unser eigener Exceptiontyp

Möchten wir Exceptions mit eigener Funktionalität programmieren müssen wir dafür nur eine eigene Exceptionklasse schreiben, die von der PHP Klasse Exception ableitet. Die meisten Methoden, die diese Klasse zur Verfügung stellt, sind mit dem Schlüsselwort final deklariert, können also nicht überschrieben werden.
Wir haben allerdings die Möglichkeit, sowohl den Konstruktor als auch die Magic Method __toString() zu überschreiben um das Verhalten unserer Exception ein wenig anzupassen. Machen wir ein Beispiel für einen eigenen Exceptiontyp.

Das Beispiel zeigt, wie einfach es ist, unseren eigenen Exceptiontyp zu definieren. Im Konstruktor können wir eigenen Code ausführen – beispielsweise eine E-Mail an den Administrator senden oder Änderungen in der Datenbank rückgängig machen, wenn etwas schief gegangen ist.

 

 

Um unseren Exceptiontyp nun zu verwenden benutzen wir einfach den Klassennamen unserer angelegten Klasse. Hier ein Beispiel:

Wie wir sehen ist es gar nicht so schwer, Exceptions zu verwenden. Dadurch dass wir im Beispiel oben die __toString() Methode überschrieben haben können wir nun auch einfach das Exceptionobjekt $e wie einen normalen String ausgeben.

Die meisten Frameworks und fertigen Libraries arbeiten mit Exceptions, daher ist es auf jeden Fall absolut sinnvoll, dass wir uns deren Funktionsweise genauer ansehen und verinnerlichen. Nur so können wir das meiste aus unserem Code herausholen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*