Fehlerbehandlung mit Python
In den seltensten Fällen, will man, dass ein Programm bei fehlerhafter Eingabe abstürzt. Dafür gibts es Fehlerbehandlung. Es ist zwar auch grundsätzlich eine gute Idee so zu programmieren, dass keine Abstürze passieren. Damit ist gemeint, dass jede Eingabe geprüft werden muss. Wird bei der Frage nach dem Alter irgendein Text eingegeben so kommt es im Laufe der Berechnungen bestimmt zu Fehlern. Prüft man direkt bei der Eingabe, ob eine Zahl eingegeben wurde, kann man sofort den Benutzer informieren, dass etwas nicht stimmt
Leider lassen sich Fehler trotzdem nicht gänzlich verhindern. Was uns wieder zur Fehlerbehandlund (oder ExceptionHandling) bringt und hier beschrieben wird.
Bei den Listen lists in Python3 sind zwei Beispiele vorgekommen, die abstürzen. Das war die Methode remove und die Methode index. Hier wird das remove Programm absturzfrei gemacht.
try catch remove
Noch einmal das abstürzende Programm in gekürzter Fassung:
list = [0, 1, 1, 123533219, 2, 3, 5, 8, 13] list.remove(123533219) # Die nächste Zeile wirft einen ValueError und das Programm stoppt list.remove(123533219) # Diese Zeile wird nicht mehr ausgeführt print(list)
Wir packen das nun in einen try Block. Im Falle eines ValueErrors springt das Programm in den Except Block
list = [0, 1, 1, 123533219, 2, 3, 5, 8, 13] try: list.remove(123533219) # Die nächste Zeile wirft einen ValueError, da 123533219 schon entfernt wurde, und das Programm fällt in den catch Block list.remove(123533219) except ValueError: print("Konnte Element nicht entfernen, da es nicht in der Liste ist") # Nun läuft das Programm weiter und die Liste kann ausgegeben werden print(list)
Es gibt natürlich Situationen, bei denen verschiedene Fehler auftreten können.
# Das brauchen wir um Informationen, über den Error zu bekommen, deshalb importieren wir das mal import sys try: # Der Versuch eine Datei zu öffnen f = open('myfile.txt') # Der Versuch eine Zeile aus der Datei zu lesen s = f.readline() # Der Versuch die gelesene Zeile in eine Zahl um zu wandeln i = int(s.strip()) except IOError as err: # IOError kann beim öffnen der Datei passieren. Sei die Datei nicht da, man darf nicht lesend darauf zugreifen, etc, etc print("I/O error: {0}".format(err)) except ValueError: # Wenn die gelesene Zeile nicht umgewandelt werden kann, passiert ein ValueError # Beispielsweise wird "Hallo Welt" eingelesen. Was soll das für eine Zahl sein? print("Konnte Daten nicht in Ganzzahl umwandeln.") except: # Ein Unbekannter Fehler passiert. Es wird eine Fehlermeldung ausgegeben... print("Unbekannter Fehler:", sys.exc_info()[0]) # ...und durch raise wird der Error weiter gegeben (Typischer Weise würde das Programm hier abstürzen, sofern der Fehler nicht wo anders abgefangen wird raise