LU08c - Logikfehler suchen

Logikfehler treten erst beim Ausführen meines Programms auf. Das Programm produziert einen Absturz oder ein falsches 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.

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

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.

  1. def main():
  2.  
  3. input_string = input("Gewünschter Betrag > ")
  4. amount = int(input_string)
  5. give_bills(amount)
  6.  
  7.  
  8. def give_bills(amount):
  9. bills = [200, 100, 75, 25, 3]
  10. index = 0
  11. while amount > 0:
  12. if bills[index] > amount:
  13. index += 1
  14. else:
  15. print(str(bills[index]) + ' KD')
  16. amount = amount - bills[index]
  17.  
  18.  
  19. if __name__ == '__main__':
  20. 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 Funktion main aufgerufen
    main wurde in Zeile 20 aufgerufen.

Marcel Suter

  • modul/m319/learningunits/lu08/logikfehler.txt
  • Zuletzt geändert: 2024/11/13 13:15
  • von kmaurizi