Artikelformat

Exception werfen oder false zurückgeben

PHP bietet wie viele andere Programmiersprachen die Möglichkeit Exceptions zu nutzen. Viele PHP Funktionen nutzen diese Möglichkeit nicht und setzen auf false. Welche Methode ist besser, gibt es überhaupt eine bessere Methode?

False wird vor allem von Funktionen wie substr, strpos oder ähnliche zurückgegeben wenn ein Fehler aufgetreten ist und im Fall von strpos auch, wenn die „Needle“ nicht gefunden wird. PDO im Gegensatz benutzt Exceptions.

Ein direkter Vorteil von Exceptions ist die Tatsache, das man mehr Fehlerfälle ausdrücken kann, als durch die Rückgabe von false. Man definiert für jeden Fehlerfall eine entsprechende und auch sprechende Exception, die dann geworfen wird. Abhängig vom Fehlerfall kann der umgebende Code entsprechend reagieren. Auch kann man Exceptions in einer höheren Ebene der Aufrufhierarchie behandeln.
Nachteil ist, dass man insbesondere bei PHP nicht direkt weiß, welche Exceptions auftreten können. Auch implizieren Exceptions einige Muster, an die sich ein Entwickler halten sollte. Zum Beispiel sollte nicht die Exception Klasse allgemein gefangen werden, da man nicht alle Fehler, sondern nur spezielle behandeln sollte. In einer index.php ist das wieder ein anderes Thema, denn hier sollte man keine Exception an den Benutzer rausgeben. Weiter sollten Exceptions möglichst lokal behandelt werden. Also bedeutet das, keine zu erwartenden Fehler durch die ganze Aufrufhierarchie wandern lassen. Auf der anderen Seite kann man aber auch Unittests schreiben die mE übersichtlicher sind, da man eine erwartete Exception per Annotation angeben kann. Somit sieht man auf einen Blick, was bei einem fehlerhaften Eingabewert oder Zustand passieren soll.

False hingegen ist in der Benutzung unproblematischer. Man gibt einfach statt einem üblichen Rückgabewert false zurück und der Fehlerfall ist gelöst. Hier muss man beachten, dass keine differenzierte Fehlerdarstellung aus der Funktion heraus möglich ist. Man muss im aufrufenden Code diesen Fehlerfall bedenken und vielleicht analysieren, wenn man mehr als nur „ein Fehler ist aufgetreten“ ausgeben will. Somit eignet sich false eben genau für Funktionen, die genau einen Fehlerklasse kennen und keine Differenzierung benötigen.
Nachteil dieses Vorgehens ist die Behandlung. Man muss bedenken, dass man den Rückgabewert immer auf Nicht-Äquivalenz zu false überprüft. Und jeder PHP-Entwickler kennt Aufrufe wie:

1
2
3
4
5
6
7
$a = strpos("einlangerstring","ge");
if ($a !== false) {
    // tue etwas
}
else {
    // Fehlerfall
}

Und an diesen Stellen treten dann auch gerne Fehler auf, denn false wird dann gerne als 0 interpretiert und schon läuft der Algorithmus Amok oder liefert ein falsches Ergebnis. Wenn man diesen Stolperstein aber beachtet, kann man natürlich auch mit false arbeiten.

Fazit:
Ich würde – wenn möglich – Exceptions nutzen. Diese sind in der Handhabung vielleicht etwas aufwändiger, bieten aber Vorteile. Da ich auch Java entwickle, bin ich natürlich nicht so ganz unparteiisch. Verständnis habe ich aber durchaus dafür, dass insbesondere in den Standard-Funktionen eher auf false als Rückgabe gesetzt wird, um die Nutzung zu vereinfachen.

Tipp:
Folgende Regeln sollte man im Umgang mit Exceptions beachten:

  • lokale Behandlung
  • Wird eine Exception gefangen und keine Information weitergegeben, so ist diese Exception ins Logfile zu schreiben
  • Keine Gott-Exceptions nutzen, Fehlerklassen definieren