Fehlerbehandlung mit Exceptions
Python stellt uns einen Mechanismus zur Verfügung um zur Laufzeit auftretende Fehler abzufangen, und entsprechend zu behandeln. Fehler werden von Python durch sogenannte Exceptions angezeigt. Wir sagen auch, dass bei einem Fehler eine Exception geworfen wird. Um einen Fehler zu behandeln, können wir die entsprechende Exception fangen. Python stellt uns einen ausgeklügelten Mechanismus zur Verfügung um mit solchen Exceptions zu arbeiten. Wir schauen uns hier aber nur den einfachsten Fall an.
Um eine Exception zu fangen umschliessen wird den Code, in dem ein Fehler auftreten kann mit der Anweisung try ... except
. Dies ist im folgenden Code illustriert:
try:
f = open("myfile.txt", "r")
content = f.read()
f.close()
except Exception as ex:
print("Beim Lesen der Datei ist ein Fehler aufgetreten")
print("Details: ", ex)
print("Diese Anweisung wird immer ausgeführt")
Diese Anweisung funktioniert wie folgt: Der Codeblock zwischen try
und except
wird normal ausgeführt. Wenn nun in diesem Teil des Codes ein Fehler auftritt, dann wird das Programm nicht einfach abgebrochen,
sondern der Codeblock im except
-Teil der Anweisung wird ausgeführt.
Hier können wir unsere Fehlerbehandlung machen. In unserem Beispiel wird eine Fehlermeldung ausgegeben. Danach läuft das Programm normal weiter.
Falls bei der Ausführung des Codeblocks zwischen try
und except
aber
kein Fehler auftritt, dann wird der Codeblock im except
-Teil nicht ausgeführt und das Programm läuft normal weiter.
Nun schauen wir uns die except
Klausel etwas genauer an. Diese ist wie folgt aufgebaut:
except Fehlerklasse as Fehlerinstanz:
Nach dem Schlüsselwort except
geben wir den Namen einer Klasse an. Diese
Klasse definiert, welche Art von Fehler wir behandeln wollen. Wenn wir auf alle
möglichen Fehler reagieren wollen, schreiben wir hier die Klasse Exception
.
Nach dem Schlüsselwort as
geben wir einen Variablennamen an. Unter diesem Namen steht uns dann ein Objekt der spezifizierten Fehlerklasse
zur Verfügung. In diesem Objekt stehen typischerweise weitere Details zum Fehler, auf die wir aus unserem Programm zugreifen können.
Wir könnten aber auch auf speziellere Fehler reagieren. So gibt es zum Beispiel
die IOError
Klasse. Diese repräsentiert nur Fehler, die bei der Ein- und Ausgabe (Input- Output) auftreten. Fehler wie Division durch 0 würden dann also noch immer zum Programmabbruch führen. Auf diesen Aspekt möchten wir hier jedoch nicht eingehen da es
über den Inhalt von dieser Vorlesung hinausgeht. Falls Sie mehr dazu wissen wollen, finden aber weitere Details dazu im offiziellen Python Tutorial.
Wir empfehlen Ihnen wie immer, wieder selber mit den Konstrukten zu experiementieren.
Experimente
- Ändern Sie den Dateinamen so, dass die Datei nicht gefunden wird
- Werden
f.read
undf.close
ausgeführt wenn ein Fehler auftritt? Fügen Sie entsprechendeprint
Anweisungen ein - Was passiert, wenn Sie in der ersten Zeile im
try
Block1/0
berechnen?- Ändern Sie die Fehlerklasse dann auf
IOException
. Was passiert?
- Ändern Sie die Fehlerklasse dann auf
- Was passiert, wenn in der
except
Klausel wieder ein Fehler auftritt, weil Sie zum Beispiel durch 0 dividieren?