Logo des digitalen Schulbuchs inf-schule.de. Schriftzug in Zustandsübergangsdiagramm eines endlichen Automaten.

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 Wegberechnung nach den Faustformeln der Fahrschule.

"""
Programm zur Wegberechnung nach den Faustformeln der Fahrschule
Autor: KB
Datum: 05.01.2012
"""
# Eingabe
geschwindigkeit = input('Geschwindigkeit (in km/h) : ')
# Verarbeitung
anhalteweg = (geschwindigkeit/10)*3
anhalleweg = anhalteweg + (geschwindigkeit/10) * (geschwindigkeit/10
# Ausgabe
print('Anhaltewegweg (in m)   :', anhalteweg)

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.

"""
Programm zur Wegberechnung nach den Faustformeln der Fahrschule
Autor: KB
Datum: 05.01.2012
"""
# Eingabe
geschwindigkeit = input('Geschwindigkeit (in km/h) : ')
# Verarbeitung
anhalteweg = (geschwindigkeit/10)*3
anhalleweg = anhalteweg + (geschwindigkeit/10) * (geschwindigkeit/10)
# Ausgabe
print('Anhaltewegweg (in m)   :', anhalteweg)

Wenn das Programm ausgeführt wird, dann gibt es nach der Benutzereingabe (hier: 100) die folgende Fehlermeldung:

>>> 
Geschwindigkeit (in km/h) : 100
Traceback (most recent call last):
  File ...
    anhalteweg = (geschwindigkeit/10)*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 anhalteweg = (geschwindigkeit/10)*3 ausgeführt wird. Python liefert als weitere Rückmeldung, dass es sich um einen TypeError handelt. Python scheitert beim Versuch, eine Division auszuführen 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.

"""
Programm zur Wegberechnung nach den Faustformeln der Fahrschule
Autor: KB
Datum: 05.01.2012
"""
# Eingabe
geschwindigkeit = float(input('Geschwindigkeit (in km/h) : '))
# Verarbeitung
anhalteweg = (geschwindigkeit/10)*3
anhalleweg = anhalteweg + (geschwindigkeit/10) * (geschwindigkeit/10)
# Ausgabe
print('Anhaltewegweg (in m)   :', anhalteweg)

Das Programm liefert ohne irgendwelche Fehlermeldungen ein Ergebnis. Aber stimmt das Ergebnis auch?

>>> 
Geschwindigkeit (in km/h): 100.0
Anhaltewegweg (in m)     : 30.0

Aufgabe 3

(a) Teste das Programm selbst. Welche Ausgabe erwartet man hier, wenn man die Faustformeln korrekt anwendet?

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

>>> globals()
{'anhalteweg': 30.0, ..., 'geschwindigkeit': 100.0, ...,  'anhalleweg': 130.0}
X

Fehler melden

X

Suche