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

Fachkonzept - Fehler in Programmen

Jeder macht Fehler!

Wenn man (komplexere) Programme entwickelt, sind sie in den seltensten Fällen direkt fehlerfrei. Obwohl unerwünscht sind Fehler etwas ganz Natürliches bei der Entwicklung von Programmen. Mit Fehlern sollte man sich also auskennen. In diesem Abschnitt werden verschiedene Arten von Fehlern vorgestellt.

Syntaxfehler

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

Als Beispiel betrachten wir die folgende Implementierung zur ägyptischen Multiplikation.

def aegyptischeMultiplikation(zahl1, zahl2):
    produkt = 0
    while zahl1 > 0:
        if zahl1 % 2 = 1:
            produkt = produkt + zahl2
        zahl1 = zahl1 // 2
        zah12 = zahl2 * 2
    return produkt

Wenn man diese Funktionsdefinition von Python ausführen lässt, dann meldet der Python-Compiler einen Syntaxfehler.

Python-Fehlermeldung: invalid syntax

Ein Compiler ist eine Verarbeitungseinheit, die u.a. ein gegebenes Programm auf die Einhaltung der Syntaxregeln der Programmiersprache überprüft. Ein Compiler liefert in der Regel auch genauere Angaben zum Fehler, z.B. die Stelle im Quelltext, an der der Fehler erkannt wurde. Im Beispiel oben wurde das Zuweisungssymbol = irrtümlicherweise anstelle des Vergleichssymbols == benutzt.

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

Als Beispiel betrachten wir das folgende lauffähige Programm.

def aegyptischeMultiplikation(zahl1, zahl2):
    produkt = 0
    while zahl1 > 0:
        if zahl1 % 2 == 1:
            produkt = produkt + zahl2
        zahl1 = zahl1 // 2
        zahl2 = zahl2 * 2
    return produkt

# Eingabe
z1 = input("Zahl 1: ")
z2 = input("Zahl 2: ")
# Verarbeitung
p = aegyptischeMultiplikation(z1, z2)
# Ausgabe
print("Produkt: ", p)

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

>>> 
Zahl 1: 13
Zahl 2: 12
Traceback (most recent call last):
  File ..., line 14, in <module>
    p = aegyptischeMultiplikation(z1, z2)
  File ..., line 3, in aegyptischeMultiplikation
    while zahl1 > 0:
TypeError: unorderable types: str() > int()
</module>

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. Im vorliegenden Beispiel werden die Benutzereingaben als Zeichenketten an die Funktion aegyptischeMultiplikation übergeben. Mit den Zeichekettenn kann dann aber nicht weitergerechnet werden.

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.

Als Beispiel betrachten wir die folgende Implementierung der Funktion aegyptischeMultiplikation:

def aegyptischeMultiplikation(zahl1, zahl2):
    produkt = 0
    while zahl1 > 0:
        if zahl1 % 2 == 1:
            produkt = produkt + zahl2
        zahl1 = zahl1 // 2
        zah12 = zahl2 * 2
    return produkt

Wenn man die Funktion mit passenden Daten aufruft, dann liefert sie ohne irgendwelche Fehlermeldungen ein Ergebnis. Nur, das Ergebnis kann hier offensichtlich nicht stimmen.

>>> aegyptischeMultiplikation(13, 12)
36

Wie man den Fehler findet, wird im nächsten Abschnitt gezeigt.

X

Fehler melden

X

Suche