Fehler in Programmen
Jeder macht Fehler!
Wenn man (komplexere) Programme entwickelt, sind sie in den seltensten Fällen direkt fehlerfrei. Fehlersuche ist also eine Tätigkeit, die zur Entwicklung von Programmen dazu gehört.
Im Folgenden werden erste Strategien beschrieben, die die Fehlersuche erleichtern. Hierzu betrachten wir das folgende Programm zur Simulation einer Mäusepopulation.
# Eingabe
print('Gib die Werte der Ausgangspopulation ein:')
jung = input('Anzahl junger Maeuse: ')
erwachsen = input('Anzahl erwachsener Maeuse: ')
alt = input('Anzahl alter Maeuse: '
# Verarbeitung
hilf = erwachsen*4 + alt*2
alt = erwachsen // 3
erwachen = jung // 2
jung = hilf
# Ausgabe:
print('')
print('Die berechneten Populationswerte sind:')
print('Anzahl junger Maeuse: ', jung)
print('Anzahl erwachsener Maeuse: ', erwachsen)
print('Anzahl alter Maeuse: ', alt)
Das Programm enthält etliche Fehler. Im Folgenden sollen diese Fehler aufgespürt werden.
Syntaxfehler
Bei einem Syntaxfehler hat man eine Regel der gewählten Programmiersprache nicht beachtet.
Versuche, das Programm auszuführen.
Python meldet einen Syntaxfehler. Syntaxfehler werden vom Python-Compiler erkannt. Ein Compiler ist eine Verarbeitungseinheit, die u.a. ein gegebenes Programm auf die Einhaltung der Syntaxregeln der Programmiersprache überprüft.
Der Python-Compiler liefert in etwa die Stelle im Programm, an der der Fehler auftritt.
Aufgabe 1
Finde den Fehler. Irgend etwas stimmt mit der Klammerung nicht. Korrigiere den Fehler.
Laufzeitfehler
Laufzeitfehler treten während der Abarbeitung des Programms (zur Laufzeit) auf.
Laufzeitfehler können - zumindest in Python - nur auftreten, wenn das Programm keine Syntaxfehler mehr enthält und somit lauffähig ist
Wir betrachten das folgende lauffähige Programm.
Wenn das Programm ausgeführt wird, dann gibt es nach der Eingabe der Populationswerte die folgende Fehlermeldung:
Fehler: TypeError: unsupported operand type(s) for FloorDiv: 'str' and 'int' on line 8
Python liefert (wie viele andere Programmiersysteme) bei Laufzeitfehlern genauere Informationen über die Art des Fehlers. Mit diesen Informationen kann man in der Regel den Fehler lokalisieren und genauer bestimmen.
Aufgabe 2
Irgend etwas funktioniert hier nicht, wenn die Anweisung alt = erwachsen // 3
ausgeführt
wird. Python liefert als weitere Rückmeldung, dass es sich um einen TypeError
handelt.
Python scheitert beim Versuch, eine Division mit einer
Zeichenkette (vom Typ str
) und einer Zahl
(vom Typ int
) auszuführen. Nur, wo kommt hier die Zeichenkette her?
Schaue dir nochmal die Eingabeanweisung genauer an. Hier fehlt etwas Entscheidendes.
Logische Fehler
Auch wenn Python keine Laufzeitfehler meldet und ein Ergebnis liefert, dann heißt das nicht, dass alles in Ordnung ist.
Logische Fehler liegen vor, wenn das System nicht die beabsichtigten Ausgaben erzeugt.
Logische Fehler sind manchmal schwer zu finden. Das Programmiersystem liefert erst einmal keine Hinweise, wo sie sich befinden. Hier muss der Programmentwickler selbst auf die Fehlersuche gehen.
Wir betrachten hierzu das folgende Programm:
Das Programm liefert ohne irgendwelche Fehlermeldungen ein Ergebnis. Aber stimmt das Ergebnis auch?
Die berechneten Populationswerte sind:
Anzahl junger Maeuse: 60
Anzahl erwachsener Maeuse: 9
Anzahl alter Maeuse: 3
Aufgabe 3
(a) Welche Ausgabe erwartet man hier, wenn man die Eingaben Anzahl junger Maeuse: 6
, Anzahl erwachsener Maeuse: 9
und Anzahl alter Maeuse: 12
macht? Vergleiche mit den tatsächlich
ausgegebenen Werten.
(b) Siehst du im Quelltext, wie es hier zu einem Fehler gekommen ist? Vielleicht hilft dir die Schritt-für-Schritt Visualisierung mit dem Python Tutor.