LU10c - Logikfehler suchen
Logikfehler treten erst beim Ausführen meines Programms auf. Das Programm produziert nicht das erwartete Resultat.
Im Gegensatz zu Syntaxfehlern zeigt mir meine IDE zunächst keinen Hinweis auf den fehlerhaften Code. Ich muss solche Fehler zunächst erkennen, die Ursache ermitteln und beheben.
Programmabsturz
Wenn ein Programm unerwartet beendet wird, sprechen wir von einem Absturz.
Die meisten Programmabstürze geschehen, weil in einer Variable ein unerwarteter Wert steht:
- Die Variable hat (noch) gar keinen Wert.
- Eine Variable in einer Berechnung enthält Buchstaben (String)
- Das Programm will durch 0 dividieren
- …
Stack Trace
Stürzt ein Programm ab, so erzeugt das System einen sogenannten Stack Trace. Dieser Stack Trace enthält wichtige Angaben zur Suche nach der Ursache:
- Welche Ausnahme (Exception) ist aufgetreten.
- Welcher Befehl führte zur Exception.
- In welcher Codezeile ist die Exception aufgetreten.
- Die Hierarchie der Funktionen welche diesen Codeblock aufgerufen haben.
Beispiel
Ich führe mein Programm aus und gebe als gewüschten Betrag 13 ein.
def main(): input_string = input("Gewünschter Betrag > ") amount = int(input_string) give_bills(amount) def give_bills(amount): bills = [200, 100, 75, 25, 3] index = 0 while amount > 0: if bills[index] > amount: index += 1 else: print(str(bills[index]) + ' KD') amount = amount - bills[index] if __name__ == '__main__': main()
Das Programm stürzt ab und zeigt mir diesen Stacktrace:
Lesen Sie den Stacktrace von unten nach oben:
- Grün:
list index out of range
/ Ich versuche auf ein Element einer Liste zuzugreifen, das nicht exisiert. - Türkis: Der verursachende Befehl ist
if bills[index] > amount:
- Gelb: Dieser Befehl steht in Zeile 12 in der Funktion
give_bills
. - Violett:
give_bills
wurde in Zeile 5 der Funktionmain
aufgerufen
main
wurde in Zeile 20 aufgerufen.