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 und 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,
die gemacht werden müssen, unabhängig davon 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. Eine solche 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, da ansonsten das Betriebssystem diese noch immer als benutzt führt, und womoglich andere Prozesse daran hindert, mit dieser Datei zu arbeiten. Um zu garantieren, dass die Datei immer richtig geschlossen
wird, nutzen wir die finally-Klausel:
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
Mit der finally Klausel haben wir ein Konzept kennengelernt, mit dem sicherstellen können, dass jede Resource die wir in unserem Programm nutzen auch wieder freigegeben wird. Wir haben aber auch gesehen, dass der Code dafür relativ umständlich zu schreiben ist.
Für einige wichtige und häufig genutzte Resourcen, 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, wird die with-Anweisung benutzt. 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 abgearbeitet ist, oder 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()
Da diese Form einfacher zu schreiben und etwas übersichtlicher als die entsprechende try-except-finally
Version ist, sieht man diese sehr häufig in modernen Python Programmen. Für Ihre eigenen Objekte brauchen Sie jedoch noch immer die finally
Klausel, wenn Sie sicherstellen wollen,
dass bei einem Fehler die richtigen Aufräumarbeiten durchgeführt werden.
Experimentieren Sie doch selbst mit diesen Konstrukten: