Skip to main content

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 und f.close ausgeführt wenn ein Fehler auftritt? Fügen Sie entsprechende print Anweisungen ein
  • Was passiert, wenn Sie in der ersten Zeile im try Block 1/0 berechnen?
    • Ändern Sie die Fehlerklasse dann auf IOException. Was passiert?
  • Was passiert, wenn in der except Klausel wieder ein Fehler auftritt, weil Sie zum Beispiel durch 0 dividieren?