Kapitel 21
Fehler finden und vermeiden
576
Tritt eine Ausnahme auf, erscheint im Shell-Fenster eine Fehlermeldung mit folgenden
Informationen:
Eine Beschreibung des Ortes im Programmtext, wo der Fehler auftrat (aufgerufene
Funktion, Zeilennummer)
Name der Exception, d.h. der Ausnahmetyp (z.B. TypeError)
ein »assoziierter Wert« – in der Regel eine kurze Erläuterung des Fehlers
Beispiel:
In diesem Fall ist der Name der Exception
IOError und der zugeordnete Wert die Zeichen-
kette
No such file or directory: 'gibtsnicht.txt'.
Sie erkennen, dass das Exception-Objekt wertvolle Information enthält, die die Lokalisie-
rung der Fehlerquelle erleichtert. Im obigen Beispiel wurde versucht, eine Datei zum Lesen
zu öffnen, die nicht existierte.
21.1.2 Testen von Vor- und Nachbedingungen mit assert
Ein Programm nennt man logisch korrekt, wenn es das leistet, was es leisten soll. Nun ist
es bei einem großen Programm leider ziemlich schwierig zu beweisen, dass es logisch kor-
Exception Erläuterung
AssertionError
Entsteht, wenn eine Zusicherung (assert) nicht zutrifft
>>> assert 1 == 2
AttributError
Entsteht, wenn man auf ein Attribut eines Objektes zugreifen will,
das es nicht gibt.
IndexError
Tritt auf, wenn beim Zugriff auf ein Sequenz-Item der angegebene
Index in der Sequenz nicht existiert.
IOError
Entsteht, wenn eine Ein-/Ausgabe-Operation misslingt (Zugriff auf
eine nicht existierende Datei etc.).
KeyError
Tritt auf, wenn ein Schlüssel eines Dictionarys nicht gefunden wird.
NameError
Wird erzeugt, wenn ein Name in den lokalen und globalen Symbolta-
bellen nicht existiert. Der assoziierte Wert ist der unbenannte Name.
TypeError
Entsteht, wenn ein Operator oder eine Funktion auf ein Objekt eines
ungeeigneten Typs angewendet wird.
ValueError
Entsteht, wenn ein ungeeigneter Wert verwendet wurde.
ZeroDivisionError
Tritt auf, w enn versucht wurde, durch null zu dividieren.
Tabelle 21.1: Einige Ausnahme-Typen
>>> f = open('gibtsnicht.txt', 'r')
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
f = open('gibtsnicht.txt', 'r')
IOError: [Errno 2] No such file or directory: 'gibtsnicht.txt'
577
21.1
Testen von Bedingungen
rekt ist. Und in der Praxis sind umfangreiche Programme niemals ganz fehlerfrei. Sie wis-
sen, dass auch teure kommerzielle Software manchmal abstürzt – eine Folge logischer
Fehler.
Wenn man sorgfältig programmiert, kann man jedoch das Fehlerrisiko einschränken. In
diesem Abschnitt geht es um eine Technik, die man das Testen von Vor- und Nachbedingungen
nennt. Ein strukturiertes Python-Programm enthält viele Funktionsdefinitionen und Klas-
sendefinitionen, die Methodendefinitionen enthalten. Wenn alle diese einzelnen Funktio-
nen und Methoden – jeweils für sich – unter allen Bedingungen korrekt arbeiten, dann sind
die Aussichten sehr gut, dass auch das gesamte Programm logisch korrekt ist.
Eine Funktion oder Methode verarbeitet Eingabedaten, die ihr als Argumente übergeben
worden sind, und liefert ein Ergebnis. In der Regel arbeitet sie nur dann korrekt, wenn die
Eingabedaten bestimmten Bedingungen genügen. Die Konjunktion (und-Verknüpfung)
dieser Bedingungen nennt man Vorbedingung.
Entsprechend gibt es auch Nachbedingungen. Sie definieren das, was die Funktion oder
Methode leisten soll. Ist immer dann, wenn die Vorbedingung erfüllt ist, auch die Nach-
bedingung erfüllt, arbeitet die Funktion korrekt.
Abb. 21.1: Mit assert-Statements schützt man eine Funktion vor ungeeigneten Eingaben.
Das Testen von Vorbedingungen kann man mit dem Sicherheitscheck des Handgepäcks am
Flughafen vergleichen. Zugelassen werden nur Gepäckstücke, die bestimmte Bedingungen
erfüllen, z.B. (Lufthansa)
Größe maximal 55 cm x 40 cm x 23 cm
nicht schwerer als 8 kg
enthält keine spitzen Gegenstände (Messer, Scheren)
enthält keine Druckgefäße
enthält keine Behälter mit mehr als 100 ml Flüssigkeit
Bei Python können Sie Vor- und Nachbedingungen mit der
assert-Anweisung testen.
Das englische Verb assert heißt zusichern. Eine
assert-Anweisung sichert zu, dass eine
bestimmte Bedingung erfüllt ist (also wahr ist). Sie hat (im einfachsten Fall) folgendes
Format:
assert bedingung
Kapitel 21
Fehler finden und vermeiden
578
Dabei ist bedingung ein boolescher Ausdruck, der wahr oder falsch sein kann. Wenn die
Bedingung nicht erfüllt ist, bricht das Programm mit einer Fehlermeldung ab. Hier einige
einfache Beispiele für Funktionen:
Die folgende Funktion entfernt das kleinste Element aus einer Liste. Die
assert-Anweisun-
gen testen, ob das als Argument übergebene Objekt eine nichtleere Liste ist.
Die folgende Funktion berechnet die »Diversität« einer Kollektion, damit ist die Anzahl
unterschiedlicher Elemente gemeint.
Hier einige Beispielaufrufe:
Die Besonderheit der Funktion ist, dass sie für alle Arten von Kollektionen gilt. Das heißt,
als Argument kann z.B. eine Liste, ein Tupel, eine Zeichenkette oder eine Menge übergeben
werden. In jedem Fall liefert die Funktion ein sinnvolles Ergebnis. Das als Argument über-
gebene Objekt muss iterierbar sein, das heißt, es muss eine Methode namens
__iter__
besitzen, die einen Iterator liefert. Genau dies wird im assert-Statement mit der Standard-
funktion
hasattr() getestet (Zeile #1).
Da bei Python Variablennamen nicht fest an Typen gebunden sind, spielen Überprüfungen
des Typs eine besondere Rolle. Wenn Sie nicht die genaue Bezeichnung eines Typs kennen,
verwenden Sie einfach die Funktion
type() und ein Exemplar des gesuchten Typs. Dazu
einige Beispiele.
Das Objekt x ist eine ganze Zahl:
def entferneMin(s):
assert type(s) == list
assert len(s) > 0
m = min(s)
s.remove(m)
def diversität(s):
assert hasattr(s, "__iter__") #1
menge = set(s)
return len(menge)
>>> diversität("Panama")
4
>>> diversität([1, 2, 3, 4, 5])
5
>>> diversität((1, 1, 1, 1))
1
assert type(x) == type(1)

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.