Читать книгу Routineaufgaben mit Python automatisieren - Al Sweigart - Страница 99
Ausnahmebehandlung
ОглавлениеBis jetzt hat das Auftreten einer Fehlermeldung oder einer Ausnahme (Exception) in Ihren Python-Programmen bedeutet, dass das gesamte Programm abstürzt. In Produktionsprogrammen wollen Sie das natürlich nicht. Stattdessen sollte das Programm in der Lage sein, Fehler zu erkennen, damit umzugehen und dann weiterzulaufen.
Betrachten Sie beispielsweise das folgende Programm, bei dem eine Division durch null vorkommen kann. Geben Sie den folgenden Code im Dateieditor ein und speichern Sie ihn als zeroDivide.py:
def spam(divideBy):
return 42 / divideBy
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
Hier definieren wir die Funktion spam mit einem Parameter und geben dann die Werte dieser Funktion für verschiedene Parameter aus, um zu sehen, was geschieht. Wenn Sie den vorstehenden Code ausführen, erhalten Sie folgende Ausgabe:
21.0
3.5
Traceback (most recent call last):
File "C:/zeroDivide.py", line 6, in <module>
print(spam(0))
File "C:/zeroDivide.py", line 2, in spam
return 42 / divideBy
ZeroDivisionError: division by zero
Die Ausführung dieses Programms können Sie sich auf https://autbor.com/zerodivide/ ansehen. Der Fehler ZeroDivisionError tritt auf, wenn Sie versuchen, eine Zahl durch null zu teilen. An der Zeilennummer in der Fehlermeldung können Sie ablesen, dass die return-Anweisung in spam() den Fehler verursacht hat.
Fehler lassen sich mit den Anweisungen try und except handhaben. Stellen Sie Code, der einen Fehler verursachen kann, in eine try-Klausel. Wenn tatsächlich ein Fehler auftritt, rückt die Programmausführung zum Beginn der anschließenden except-Klausel vor.
In unserem Beispiel können Sie also den Code für die Division in eine try-Klausel stellen und in einer except-Klausel Code für den Fall angeben, dass eine Division durch null auftritt:
def spam(divideBy):
try:
return 42 / divideBy
except ZeroDivisionError:
print('Error: Invalid argument.')
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
Wenn Code in einer try-Klausel einen Fehler hervorruft, fährt die Programmausführung unmittelbar mit dem Code in der except-Klausel fort und läuft anschließend ganz normal weiter. Der vorstehende Code führt zu folgender Ausgabe:
21.0
3.5
Error: Invalid argument.
None
42.0
Die Ausführung dieses Programms können Sie sich auf https://autbor.com/tryexceptzerodivide/ ansehen. Wenn in einem try-Block Funktionsaufrufe stehen, werden auch jegliche Fehler abgefangen, die dabei auftreten. Betrachten Sie das folgende Programm, bei dem die Aufrufe von spam() in einem try-Block stehen:
def spam(divideBy):
return 42 / divideBy
try:
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
except ZeroDivisionError:
print('Error: Invalid argument.')
Dieses Programm führt zu folgender Ausgabe:
21.0
3.5
Error: Invalid argument.
Die Ausführung dieses Programms können Sie sich auf https://autbor.com/spamintry/ ansehen. In diesem Fall wird print(spam(1)) niemals ausgeführt, da die Ausführung nach dem Code in der except-Klausel nicht wieder in den try-Block zurückspringt, sondern ganz normal im Programm fortgesetzt wird.