Direkt zum Hauptbereich

Vergebung bitte!


"Es ist leichter um Vergebung zu bitten, als um Erlaubnis zu fragen"(EAFP)

Ich verweise auf dieses bei Python etablierte Prinzip, um damit meiner Liste von If-Alternativen eine weitere Möglichkeit hinzuzufügen.

Statt also vor dem Aufruf einer Funktion abzufragen, ob deren Aufruf vielleicht eine Ausnahme auslöst (Erlaubnis), ruft man statt dessen einfach die Funktion auf und reagiert im Nachgang auf eventuelle Ausnahmen (Vergebung).

Dieses Vorgehen ist für Entwickler, die aus anderen Sprachen wie Java oder C# kommen zuerst befremdlich, da dort Exceptions als teuer gelten.

Wenn man sich jedoch daran gewöhnt hat, stellt sich EAFP als viel sauberer da. Zum einen findet die Überprüfung der möglichen Fehlerursachen in genau der Funktion statt, die am besten weiß, welche Probleme ihre Operationen bewirken können. Das trägt dem Single Responsibility Prinzip Rechnung. Warum sollte jeder Aufrufer immer wieder den selben Code schreiben müssen, der eigentlich gar nicht in seiner Verantwortung liegt?

Aus dem selben Grund ist EAFP auch sicherer, da ich so keine Bedingung bei der Prüfung vergessen kann.

Ich will eine Datei öffnen und denke vielleicht noch daran, dass diese Datei ja nicht existieren könnte. Also frage ich vor dem Öffnen noch die Existenz der Datei ab. Ich vergesse aber, dass der Zugriff auch wegen fehlenden Rechten scheitern kann. BAM! Nicht behandelte Ausnahme.

Da lasse ich doch lieber gleich die Open-Funktion alles selber testen und behandle jede Ausnahme fachmännisch.

Und was hat Pippi Langstrumpf damit zu tun? Na hat die jemals um Erlaubnis gebeten? (Naja, um Vergebung allerdings auch nicht...)

 

Kommentare

  1. Auch nach nun fast 5 Jahren mit Python ist dies für mich immer noch befremdlich. Vermutlich stört mein Auge die try-catch Blöcke. An vielen Stellen fände ich es ausreichend, wenn zum Beispiel ein None Wert zurückgeliefert würde, statt gleich eine Exception zu werfen. Vermutlich liegt das auch daran, dass an einigen Stellen im Projekt schlecht geschriebener Code existiert, der jedesmal eine Exception wirft, wenn es für eine Suchanfrage kein Ergebnis gibt. Für mich ist eine leere Ergebnismenge aber auch ein valides Ergebnis und sollte nicht zu einer Exception führen.

    AntwortenLöschen
  2. Auch hier gilt, wie überall: Das richtige Werkzeug für die passende Aufgabe.

    Eine Prozedur (um mal den Pascal-Jargon zu nutzen), die nichts zurückgeben soll, kann (und sollte) Fehler nur über Exceptions kommunizieren.

    Eine Funktion sollte, so mein Philosophie, so implementiert sein, dass sie nur gültige Werte zurückliefert. Es muss möglich sein, mit dem Rückgabewert weiterzuarbeiten, ohne Überprüfungen auf Gültigkeit vornehmen zu müssen.

    Also eine Funktion, die, wie oben von dir beschrieben, eine Liste von Elementen zurückliefert, kann ohne Probleme auch eine leere Liste zurück liefern. Die kann ich ohne weiteren Check in eine foreach-Schleife stecken, ohne dass es zu Problemen kommt.

    Eine Exception wäre nur dann zurechtfertigen, wenn aus irgendeinem Grund kein gültiger Wert zurückgeliefert werden kann. Z.B. ein File-Handle für eine nicht existierende zu lesende Datei.

    Aber auch hier könnte das Pattern "Null-Objekt" Anwendung finden.

    AntwortenLöschen

Kommentar veröffentlichen

Beliebte Posts aus diesem Blog

Utopie gesucht

In den 90er Jahren gab es meiner Meinung nach eine positive Zukunftssicht. Das sah man u.a. in der Serie Star Trek The next generation. Heute dagegen scheint es nur noch pessimistische Blicke auf die Zukunft zu geben. Auch die aktuellen Star Trek Serien stellen eine düsterere Welt dar. Dies könnte zu einer selbst erfüllenden Prophezeiung werden. Gibt es in der aktuellen Popkultur noch Utopien?

Avatar - mit Glatze bitte!

Vor einigen Monaten kamen zwei neue Mitarbeiter in unser Team. Da einer von ihnen auch Martin hieß, führte das oft zu Verwechslungen und der Nachfrage „welcher jetzt?“ – vor allem in der Remote-Kommunikation. Beschreibungen wie „der zweite Martin“ oder „der andere Martin“ hielt ich für unpassend. Also schlug ich vor, dass ich von nun an einfach einen anderen Rufnamen erhalte und wählte: „Guybrush“. Damit das auch immer präsent ist, ersetzte ich auch mein Profilbild an allen mir möglichen Orten durch ein Pixelbild von Gybrush aus Monkey Island 2 : Wie erwartet, setzte sich das sehr schnell durch. Vor einigen Tagen wollte ich dieses Bild jedoch durch eine etwas auflösungsstärkere Variante ersetzen. Die gefundenen Bilder machten jedoch sehr deutlich, dass es doch erheblich an Ähnlichkeit mangelte. Vor allem die Haare entsprachen so gar nicht meiner Frisur. Also beschloss ich, dass dies doch mal ein guter Einsatz für einen AI-Bildgenerator wäre. Die zwei mit denen ich bisher gearbeitet h...

Markt und Staat - Teil 1

"Entschuldigen Sie bitte! Was heißt Mittagessen nach Vortragsthema?" "Nun, das heißt, dass der Ablauf des Mittagessens sich nach den Themen des jeweiligen Tages richtet." "Können Sie mir das etwas genauer erklären?" "Aber gerne. Sehe Sie, der erste Tag steht unter dem Thema 'Der demokratische Staat'. Zu Tagesbeginn sammeln wir von allen Konferenzteilnehmern 5,- Euro ein: die Mittagessenpauschale." "Verstehe." "Im Laufe des Vormittages teilen wir Speisekarten mit den verfügbaren Mahlzeiten aus. Sie kreuzen an, welches Gericht Ihnen zusagt und geben die Karte bis zum Mittag wieder bei uns ab." "Ok. Ich schreibe also meinen Namen auf den Zettel..." "Nein." "Aber woher wollen Sie dann wissen für wen welches Gericht ist?" "Das ist nicht wichtig. Alle Teilnehmer bekommen das gleiche." "Aber warum dann die Sache mit dem Ankreuzen?" "Um festzustellen, für welche Mahlzeit s...