Bad Practice: Fehler verschlucken durch Sprungbefehle im finally-Block
Im Vorgängerartikel habe ich bereits gezeigt, wie bei der Programmiersprache Java eine auftretende Exception im catch- oder finally-Block die ursprüngliche Exception maskieren kann, damit die Fehlersuche sehr erschwert. Im heutigen Artikel geht es um eine ganz ähnliche Situation: Der finally-Block darf auch nicht mit anderen Sprungbefehlen verlassen werden!
Code-Beispiel
Zur einfacheren Darstellung verwenden wir ein konstruiertes Beispiel, welches zwar inhaltlich keinen Sinn macht, aber das Prinzip gut verdeutlicht.
Das Code-Beispiel besteht aus einer Schleife und einem eingeschachelten try-finally. Im finally-Block wird zunächst eine cleanup-Methode aufgerufen, welche zur Simulation von Aufräumarbeiten hier einfach nur „simulating cleanup“ ausgibt. Bei Eintreten einer bestimmten Bedingung erfolgt ein Schleifen-Abbruch mittels break-Statement.
Die Ausgabe sieht wie folgt aus:
Von der Exception ist nichts zu sehen.
Ähnliches passiert bei einem return-Statement im finally-Block:
Auch hier wird die Exception komplett verschluckt:
Glücklicherweise zeigen viele moderne Entwicklungsumgebungen in der Zeile mit dem Sprungbefehl eine entsprechende Warnung an. Sofern man diese Warnungen beachtet und nicht unterdrückt hat, sollte der Fehler mit den Sprung-Befehlen eigentlich nicht passieren.
Exceptions führen natürlich ebenfalls dazu, dass aus dem finally-Block heraus gesprungen wird. Zu diesem Spezialfall sei noch einmal auf den Vorgängerartikel verwiesen, welcher ausführlicher auf diese Situation eingeht und verschiedene Gegenmaßnahmen beleuchtet.
Fazit
Verwende niemals Sprungbefehle im finally-Block! Also kein break, continue, return, throw…
Denn:
- dies erschwert die Fehlersuche extrem, da wir den aufgetretenen Fehler gar nicht sehen.
- dies ist gefährlich, da wir eine auftretende Exception dadurch vollkommen ignorieren. Der normale Programmfluss wird fortgesetzt, was schwerwiegende Folgefehler nach sich ziehen kann.
Quellen:
- Can I have business logic in Finally block? (stackoverflow): „…the finally block has the ability to silently swallow exceptions … you could code around this defensively with more try / catch blocks, but just be aware…“
- Jump statements should not occur in „finally“ blocks (rules.sonarsource.com)
Bildnachweis: Das Titelbild zur Blogserie „Exception Handling“ basiert auf einer Grafik von mohamed_hassan auf Pixabay.