Kapitel 5
Kontrollstrukturen
142
Betrieb unterbrochen wird, sind unter Umständen sämtliche gespeicherte Daten ruiniert.
Und was kann alles passieren, wenn ein Programm abbricht, das ein Atomkraftwerk steuert ...
Deshalb möchte man natürlich Programmabbrüche, die durch Fehlersituationen verur-
sacht werden, nach Möglichkeit vermeiden. Und wenn sich ein Abbruch nicht verhindern
lässt, sollen zumindest Vorkehrungen zur Schadensbegrenzung getroffen werden. Python
bietet dazu eine spezielle Kontrollstruktur an, die
try-Anweisung. Es gibt zwei Varianten
von
try-Anweisungen.
Eine try...except-Anweisung verhindert einen Programmabbruch durch das System.
Eine kritische Operation, die von Rahmenbedingungen abhängig ist, wird nur versuchs-
weise durchgeführt. Scheitert der Versuch – das heißt, es gibt einen Fehler –, dann
bricht das Programm nicht ab, sondern es wird das getan, was in
except-Klauseln fest-
gelegt ist.
Bei einer try...finally-Anweisung wird ein Programmabbruch nicht unterdrückt. In
der
finally-Klausel wird eine Anweisungsfolge definiert, die vor dem Abbruch ausge-
führt wird, z.B. um »Aufräumarbeiten« zu erledigen, die auf jeden Fall durchgeführt
werden müssen. Bei einem Textverarbeitungsprogramm würde man in einer
finally-
Klausel dafür sorgen, dass der in Arbeit befindliche Text abgespeichert wird. Ein Beispiel
für den Einsatz der
try...finally-Anweisung finden Sie in Abschnitt 9.2.
5.7.1 try...except
Die try...except-Anweisung hat (etwas vereinfacht) folgendes Format:
Hinter dem Schlüsselwort
try steht ein Doppelpunkt, in der darauf folgenden Zeile
beginnt (eingerückt) der Anweisungsblock, der versuchsweise ausgeführt werden soll.
Hinter dem Schlüsselwort
except kann optional ein Fehlertyp stehen (z.B. NameError
oder SyntaxError). Nach dem Doppelpunkt folgt der Anweisungsblock, der im Fehlerfall
ausgeführt wird.
Das folgende Skript fängt Laufzeitfehler bei einer
input-Anweisung ab:
Die
try-Anweisung wird folgendermaßen abgearbeitet:
Zuerst wird die try-Klausel, genauer gesagt der Anweisungsblock zwischen den Schlüs-
selwörtern
try und except, ausgeführt.
try:
anweisungsblock 1
except [ausnahmetyp]:
anweisungsblock 2
try:
zahl = int(input ("Bitte geben Sie eine Zahl ein: "))
print("Danke für die Zahl.")
except:
print("Eingabe nicht in Ordnung.")
143
5.7
Abfangen von Ausnahmen mit try
Wenn kein Laufzeitfehler auftritt, wird die except-Klausel übersprungen und die Aus-
führung der
try-Anweisung ist beendet.
Falls ein Fehler auftritt, wird die Ausführung des try-Anweisungsblocks sofort abgebro-
chen (das heißt, nachfolgende Befehle dieses Blocks werden übersprungen). Stattdessen
wird der Anweisungsblock der
except-Klausel ausgeführt.
Eine try-Anweisung muss immer eine except-Klausel besitzen. Wenn im Fehlerfall nichts zu
tun ist, schreiben Sie hinter
except: einfach die leere Anweisung pass.
Eine
try-Anweisung kann mehrere except-Klauseln besitzen, um auf unterschiedliche Feh-
ler-Arten angemessen zu reagieren. Es wird höchstens eine Klausel ausgeführt. In diesem
Fall wird hinter dem Schlüsselwort
except ein Fehlertyp angegeben. Tritt ein Laufzeitfehler
dieses Typs auf, so wird die entsprechende Anweisungsfolge ausgeführt. Das folgende Skript
ist eine Luxusversion des obigen Beispiels. Hier wird so lange eine Eingabe gefordert, bis der
Benutzer eine ganze Zahl eingegeben hat. In den verschiedenen
except-Klauseln werden
passende Fehlermeldungen auf den Bildschirm geschrieben. Außerdem verwenden wir hier
eine »unendliche«
while-Schleife, die bei erfolgreichem Absolvieren der try-Klausel mit
break unterbrochen wird.
Programmlauf:
Falls in der
try-Klausel ein Laufzeitfehler auftritt, dessen Typ nicht in einer except-Klausel
berücksichtigt wird, so kommt es zum Abbruch des Programms und einer entsprechenden
Fehlermeldung. Im obigen Beispielskript kann dies nicht passieren, weil am Ende eine
except-Klausel ohne Angabe eines Fehlertyps steht (#1).
Fehlt die Angabe eines Fehlertyps in einer
except-Klausel, so wird der zugehörige Anwei-
sungsblock bei jedem beliebigen Laufzeitfehler ausgeführt – es sei denn, es gibt weiter oben
in derselben
try-Anweisung eine except-Klausel, die auf diesen Fehlertyp spezialisiert ist.
while True:
t r y :
zahl = int(input ("Bitte geben Sie eine ganze Zahl ein: "))
print("Danke für die Zahl.")
b r eak
except ValueError:
print("Ihre Eingabe kann man nicht in eine",
"ganze Zahl umwandeln.")
e x c e pt: #1
print("Eingabe nicht in Ordnung.")
Bitte geben Sie eine ganze Zahl ein: eins
Ihre Eingabe kann man nicht in eine ganze Zahl umwandeln.
Bitte geben Sie eine ganze Zahl ein: 1.0
Ihre Eingabe kann man nicht in eine ganze Zahl umwandeln.
Bitte geben Sie eine ganze Zahl ein: 1
Danke für die Zahl.

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.