Exkurs - 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)

Syntaxfehler

Wenn du das Programm von Python ausführen lassen möchtest, dann meldet der Python-Compiler einen Syntaxfehler.

Syntax-Error

Bei einem Syntaxfehler hat man eine Regel der gewählten Programmiersprache nicht beachtet.

Syntaxfehler werden in Python vom 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 mit einer roten Markierung (in etwa) die Stelle im Programm, an der der Fehler auftritt. Diese Rückmeldung sollte man also immer bei der Fehlersuche genau beachten.

Syntaxfehler

Aufgabe 1

Probiere das selbst aus. Erkennst du den Fehler. Er befindet sich vor der roten Markierung. Irgend etwas stimmt mit der Klammerung hier 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.

# 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)

Wenn das Programm ausgeführt wird, dann gibt es nach der Eingabe der Populationswerte die folgende Fehlermeldung:

>>> 
Gib die Werte der Ausgangspopulation ein:
Anzahl junger Maeuse: 6
Anzahl erwachsener Maeuse: 9
Anzahl alter Maeuse: 12
Traceback (most recent call last):
  File ...
    alt = erwachsen // 3
TypeError: unsupported operand type(s) for //: 'str' and 'int'

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.

# Eingabe
print('Gib die Werte der Ausgangspopulation ein:')
jung = int(input('Anzahl junger Maeuse: '))
erwachsen = int(input('Anzahl erwachsener Maeuse: '))
alt = int(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 liefert ohne irgendwelche Fehlermeldungen ein Ergebnis. Aber stimmt das Ergebnis auch?

>>> 
Gib die Werte der Ausgangspopulation ein:
Anzahl junger Maeuse: 6
Anzahl erwachsener Maeuse: 9
Anzahl alter Maeuse: 12

Die berechneten Populationswerte sind:
Anzahl junger Maeuse:  60
Anzahl erwachsener Maeuse:  9
Anzahl alter Maeuse:  3

Aufgabe 3

(a) Teste das Programm selbst. Welche Ausgabe erwartet man hier? Vergleiche mit den tatsächlich ausgegebenen Werten.

(b) Siehst du im Quelltext, wie es hier zu einem Fehler gekommen ist? Vielleicht hilft dir der folgende Python-Dialog.

>>> globals()
{..., 'erwachsen': 9, 'jung': 60, ..., 'erwachen': 3, ..., 'alt': 3, ..., 'hilf': 60}
X

Fehler melden

X

Suche