am 7. Mai 2009
Diesen Artikel schiebe ich schon eine ganze Weile vor mir her. Obwohl es für mich intuitiv klar ist, wann ich Exceptions zu nutzen habe, finde ich es auf keinen Fall einfach dies auch in Worte zu fassen. Heute will ich es einfach mal versuchen, wenn es nicht klappt, dann hab ich ja nichts verloren.
Ich versuche mich mal mit der Standard Definition. Excpetions (Ausnahmen) werden immer dann geworfen, wenn etwas unerwartetes passiert. So das war’s, ich bin raus. Na gut, vielleicht noch mal ein paar Beispiele, was etwas unerwartetes sein könnte. Das Öffnen einer Config Datei, die ich für den Programmablauf brauche, so etwas ist unerwartet. Der Versuch des Öffnens einer Datei, deren Name mir der User als String übergeben hat, ist keine Ausnahme wert, falls diese nicht vorhanden ist. Niemals dem User vertrauen, ist eh so ein Leitspruch, der einem viel Ärger ersparen kann.
Ein Fall, den ich vor kurzem gesehen habe (ich weiss aber leider nicht mehr wo) ist das Validieren der Userinformationen beim Anlegen eines neuen Benutzers. Hier gab es so etwas wie setUserName( $name ). Diese Methode hat eine Exception geworfen, falls der Name nicht einem bestimmten regulären Ausdruck genügt hat. Bis jetzt passt das wunderbar zu meiner Definition. Jetzt ging es aber weiter. Die Eingaben des Users wurden direkt in diese Methode gepumpt. Das darf natürlich nicht sein, denn wir wissen ja, Userinput ist böse. Wir brauchen also so etwas wie isValidUsername( $name ), was ich vor dem zuordnen aufrufen sollte. Und schwupps wird keine Ausnahme mehr verwendet, ausser der Name ändert sich irgendwie auf unerklärliche Art und Weise zwischendrin und das wäre wirklich unerwartet.
Ich glaube jetzt sind wir mal gar nicht schlauer. Was ich eigentlich sagen will, Exception darf man gerne werfen, man muss dem Programmierer nur die Möglichkeit drum herum zu kommen. Der Fokus sollte hier auf der Validierungsfunktion liegen. Erst diese macht das ganze anwendbar, ohne in eine “falsche” Ausnahme zu laufen.
Aber warum sollte man Execptions nicht als normale Kontrollstruktur verwenden, wie zum Beispiel IF? Von Java weiß ich, dass Exceptions sehr kostspielig sind, also kostspielig im Sinne von dauern sehr lange. Ob man dies eins zu eins auf PHP übertragen kann bin ich mir nicht sicher. Aber vielleicht liest ja ein Johannes mit und der kann seinen Senf dazu abgeben. Was ich aber weiß, ist dass Exceptions, die nicht richtig gefangen werden und irgendwo unerwartet im Source dann doch gestoppt werden die Wartbarkeit und die Fehlerfindung so extrem erschweren, dass man keinen Spaß man daran hat.
Ich glaube aber, ihr macht es was ihr wollt und lasst euch von mir nicht reinreden. Macht also weiter so, wird schon richtig sein. Ich muss ja euren Code nicht warten.