Cleanup und die with-Anweisung
Im vorigen Artikel haben wir die Grundform der try except
Anweisung kennengelernt. Hier ist diese zur Erinnerung nochmals skizziert:
try:
# Code in dem Fehler auftreten können
except Exception as e:
# Fehlerbehandlung
Wenn im Code im Try-Block ein Fehler auftritt, kann dieser im except-Block abgefangen und entsprechend behandelt werden. Wenn kein Fehler auftritt, dann läuft die Ausführung einfach nach dem except Block weiter. Der Code im except Block wird nicht ausgeführt. Python kennt noch eine Erweiterung dieser Form. Diese sieht wie folgt aus:
try:
# Code in dem Fehler auftreten können
except Exception as e:
# Fehlerbehandlung
finally:
# Cleanup Code
Die finally-Klausel wird benutzt um Aufräumarbeiten durchzuführen, welche unabhängig davon ausgeführt werden müssen, ob ein Fehler auftritt oder nicht. Python garantiert, dass egal was passiert, der Code in der finally Klausel ausgeführt wird. Das ist sogar der Fall, wenn in der Fehlerbehandlung selbst wieder ein Fehler auftreten würde. Die `finally-Klausel ist zum Beispiel immer dann nötig, wenn wir mit Systemressourcen wie Dateien arbeiten. Wenn wir eine Datei öffnen, dann müssen wir diese auch wieder schliessen. Ansonsten würde das Betriebssystem diese noch immer als benutzt aufführen, und andere Prozesse daran hindert, mit dieser Datei zu arbeiten. Um sicherzustellen, dass Dateien auch wieder geschlossen werden, können wir folgendes schreiben:
try:
f = open("myfile.txt", "r")
try:
# Arbeiten mit der Datei
content = f.read()
except IOError as e:
print("Ein Fehler beim Lesen der Datei ist aufgetreten")
finally:
print("Datei wird geschlossen")
f.close()
except:
print("Datei konnte nicht geöffnet werden")
Die with-Anweisung
Der obige Code ist korrekt, aber etwas umständlich zu schreiben.
Für wichtige und häufig genutzte Ressourcen, wie zum Beispiel das file object, stellt uns
Python deshalb schon vordefinierte Aufräumprozeduren zur Verfügung. So weiss Python, dass
wenn eine Datei geöffnet werden soll, diese auch wieder geschlossen werden muss.
Um diese vordefinierten Aufräumprozeduren zu nutzen, brauchen wir die with
-Anweisung.
Diese funktioniert wie folgt:
with Ausdruck as name:
Code-Block
Der Ausdruck wird ausgewertet und ist innerhalb des Codeblocks der with-Anweisung unter dem angegebenen Namen verfügbar. Wenn der Code-block fertig abgearbeitet ist, oder wenn ein Fehler aufgetreten ist, wird die vordefinierte Aufräumprozedur ausgeführt.
Wenn wir mit Dateien arbeiten, sieht das Muster wie folgt aus:
with open("myfile.txt", "r") as f:
# Code-Block, der mit der Datei f arbeitet wie z.b.
content = f.read()
Diese Code ist viel einfacher zu schreiben und auch übersichtlicher als die entsprechende Version mit try-except-finally
. Deshalb sieht man solchen Code sehr häufig in modernen Python Programmen.
Es ist aber wichtig anzumerken, dass dies kein vollwertiger Ersatz zu Fehlerbehandlung mit try-except-finally
ist. So funktioniert dies nicht mit ihren eigenen Klassen, und Sie haben auch
keine Möglichkeit auf verschiedene Arten von Fehler mit ihrer eigenen Logik zu reagieren.
Experimente:
Probieren Sie es doch gleich selbst aus:
- Was passiert, wenn die Datei nicht gefunden wird?
- Wie sieht die Fehlermeldung in der ersten Version, und wie in der vereinfachten Version aus? Welche ist besser?
Fragen und Kommentare
Haben Sie Fragen oder Kommentare zu diesem Artikel? Nutzen Sie das Forum und helfen Sie sich und Ihren Mitstudierenden dieses Thema besser zu verstehen.