Sven Rautenberg: OOP php: verschachtelte Klassen und ein Zugriff auf eine Eigensc

Beitrag lesen

Exceptions sind, wenn man es böse betrachtet, eine moderne Form von GOTO. Der normale Programmablauf wird verlassen, und im catch-Teil weitergemacht. Deshalb sollte man dieses Mittel eher sparsam einsetzen, insbesondere nicht zur Steuerung des Programmflusses mißbrauchen.

Zugegeben, ich verwende sie zur Programmsteurung. Finde ich aber auch nicht so merkwürdig. Wenn ich eine Funktion habe, die mit einer Datei allerhand Dinge anstellt und ich als erstes im try-Block mal habe if(!file_exists($file)) throw new Exception("File not found.", 1); und damit der weitere Ablauf der Funktion verhindert wird, ist das doch mehr als gewünscht. Oder soll ich jedesmal tolle if-Blöcke bauen um bis zur 14-ten Verschachtelung zu kommen?

Weil du es gerade fragst: Nein, Verschachtelungen über Ebene 5 hinaus sind auch böse.

Und zum Zweiten: Warum hast du in der Funktion überhaupt ein try/catch? Das finde ich schon falsch. Entweder Code ruft innerhalb von try diverse Funktionen auf, die IHRERSEITS eventuell Exceptions werfen und damit den Sprung in den (evtl. passenden, vgl. Exception-Typen oben) catch-Block veranlassen, oder es wird Code ausgeführt, der seinerseits Exceptions wirft - dann steckt der aber eben gerade nicht in einem try/catch.

In der Summe kommt es natürlich aufs Gleiche raus: In der äußeren Funktion wird der try-Block betreten, darin eine Funktion aufgerufen, die eine Exception wirft, und schon ist man direkt im catch-Block - warum ist dann der Funktionsaufruf dazwischen nötig, man könnte doch auch alles in eins zusammenfassen?

Der Unterschied ist der Scope: Wenn die äußere Funktion try/catch macht, dann erwartet sie eventuell auftretende Exceptions, weiß aber nicht genau, ob und wo innerhalb der aufgerufenen Funktionen diese auftreten könnten. "Irgendwo" ist keine sehr präzise Angabe, und auch gar nicht nötig, denn unter dem Strich bedeutet eine Exception immer: "Die aufgerufene Funktion wird das vereinbarte Ergebnis nicht liefern."

Umgekehrt bedeutet das Werfen in der inneren Funktion: "Ich bin auf ein unlösbares Problem gestoßen, habe aber keine Ahnung, wie wichtig das im Moment gerade für meinen aufrufenden Code ist - ich informiere ihn mit einer Exception".

Wenn du aber innerhalb von try eine Exception wirfst, um in den catch-Block derselben Funktion "weiter unten" zu gelangen, ist das erstmal ein Mißbrauch von Exceptions zur Programmflusssteuerung. Für sowas gibt es ehrlichere Methoden.
[...]

Im Prinzip gibt es nur zwei Möglichkeiten, mit Exceptions umzugehen: Entweder, der aufrufende Code einer exceptionwerfenden Funktion kann die Exception fangen, weil er auch mit dem Fehlerfall umzugehen weiß. Das kann beispielsweise in der Bereitstellung eines passenden Ersatzes münden (z.B.: getArrayOfDatabases() -> DbUnavailableException -> catch: return array()).

Alternativ fängt man die Exception eben gerade nicht, sondern lässt sie ganz bis nach "oben" durchschlagen - was dann natürlich nicht ganz so elegant zu einer Fehlermeldung führen würde, weshalb es eine gute Idee ist, auf oberster Codeebene ein pauschales Catch für alle Exceptions einzufügen, welcher den HTTP-Status auf 500 "Internal server error" setzt und dann noch eine hübsche Fehlerseite ausgibt.

  • Sven Rautenberg

Je nach Lage fange ich sie entweder unmittelbar oder lasse sie nach oben durchschlagen.

Vielen Dank für Deine kompetente Hilfe. Bitte verstehe aber, dass ich nicht verstehen kann, wieso das immer so schnippisch ablaufen muss. Ich bin in der Situation des Unwissenden nur auf der Suche nach Informationen. Ich bin nicht faul oder dumm. Ich schätze Deine Hilfe, aber ich schätze nicht diese demotivierenden Kommentare "grausig", "grausame schlecht",...

Ich kritisiere deinen Code. Ich kritisiere nicht dich. Insbesondere greife ich dich nicht persönlich an. Den Einsatz von starken Worten zur Dramatisierung der Beschreibung mögest du bitte entschuldigen, oder großzügig darüber hinwegsehen, aber es geht leider nicht immer im Weichspülmodus ab.

Wenn du mir Adjektive mit ähnlich prägnanter Bedeutung und ebengleicher Kürze nennst, die freundlichere Wirkung im Text entfalten, werd' ich's damit gern beim nächsten Mal probieren. ;)

- Sven Rautenberg