Teil 6: Fehler
Lernziele
- Syntaxfehler, Laufzeitfehler und logische Fehler unterscheiden
- Eine Fehlermeldung lesen und die betroffene Zeile finden
- Erklären, warum Schlüsselwörter keine Variablennamen sein dürfen
- Fehlerhafte Programme korrigieren
- Ein Programm gezielt testen, statt nur zu hoffen, dass es stimmt
Keine neuen Befehle. Neu ist die Fähigkeit, Fehlermeldungen zu lesen.
Fehler
Beim Programmieren treten Fehler auf, immer. Bei grösseren Projekten macht das Finden und Beheben von Fehlern mehr als die Hälfte der Arbeitszeit aus. Fehler zu machen ist also kein Zeichen von Unfähigkeit, sondern der Normalfall.
Wenn ein Fehler auftritt, meldet Python die Zeile, in der er aufgetreten ist, und gibt eine kurze Erklärung dazu. Das ist fast immer der erste Anhaltspunkt. Lies die Meldung, bevor du etwas änderst.
Syntaxfehler
Syntaxfehler sind Verstösse gegen die Grammatik der Programmiersprache. Python beginnt gar nicht erst, das Programm auszuführen.
print "ein Test"
print("Hallo"
x = "Informatik
print("Hallo")print("Welt")
Typische Ursachen sind fehlende Klammern, fehlende Anführungszeichen, ein fehlender Zeilenumbruch zwischen zwei Befehlen und falsche Einrückung.
SchlüsselwörterManche Wörter sind in Python reserviert und dürfen nicht als Variablennamen dienen. Dazu gehören unter anderem
if,else,for,while,def,class,from,import,return,and,or,not,True,FalseundNone. Folgendes gibt deshalb einen Syntaxfehler:class = "Informatik" from = "Zuerich"Im Editor erkennst du Schlüsselwörter daran, dass sie farbig hervorgehoben werden.
Laufzeitfehler
Laufzeitfehler treten erst beim Ausführen auf. Die Grammatik stimmt, aber das Programm stösst auf eine Anweisung, die es nicht ausführen kann.
callMe = "Maybe"
print(callme)
print(1 / 0)
print("Zehn" + 10)
verboten = int("drei")
Typische Ursachen sind Division durch null, das Verrechnen unverträglicher Typen, Zugriff auf eine nicht definierte Variable und misslungene Umwandlungen. Beachte, dass Python zwischen Gross- und Kleinschreibung unterscheidet: callMe und callme sind zwei verschiedene Namen.
Logische Fehler
Syntax- und Laufzeitfehler sind angenehm, weil Python dich sofort darauf hinweist. Logische Fehler sind heimtückischer: Das Programm läuft durch und liefert ein Ergebnis, nur ist es falsch.
x = 3
y = 4
durchschnitt = x + y / 2
print(durchschnitt)
Was hier schiefging
Aufgaben
Aufgabe 6.1Korrigiere den Syntaxfehler, sodass das Programm die Summe der Zahlen von 1 bis 10 ausgibt.
Aufgabe 6.2Korrigiere den Laufzeitfehler, sodass in der ersten Zeile
Hellound in der zweitenJoesteht.
Aufgabe 6.3Korrigiere die Syntaxfehler, sodass das Programm die Temperatur ausgibt.
Aufgabe 6.4Alle drei Programme sollen
19ausgeben. Entscheide für jedes, ob ein Syntaxfehler, ein Laufzeitfehler oder ein logischer Fehler vorliegt.
Aufgabe 6.5In jedem der zehn Ausschnitte steckt ein Fehler. Trage in der Tabelle
Sfür Syntaxfehler,Lfür Laufzeitfehler oderGfür logischen Fehler ein. Eine Begründung brauchst du nicht.# A print(5 +) # B alter = 15 print(Alter) # C umfang = 2 * 3.14 + 5 # D print("Hallo" # E print(10 / 0)# F x = 5 print("x ist " + x) # G laenge = 4 breite = 3 flaeche = laenge + breite # H zahl = int("drei") # I durchschnitt = (2 + 4 + 6) / 2 # J class = "3d"
ABCDEFGHIJ
Weitere Aufgaben
Zusatzaufgabe 6.6Du kaufst Milch für 2 Franken und Fleisch für 4 Franken. Auf beides kommt eine Steuer von 3 Prozent. Schreibe ein Programm, das die Gesamtkosten ausgibt. Baue absichtlich zuerst einen logischen Fehler ein, indem du die Steuer nur auf ein Produkt rechnest, und korrigiere ihn danach.
Zusatzaufgabe 6.7Korrigiere die folgenden Zeilen und erkläre jeweils, um welche Fehlerart es sich handelt.
Zusatzaufgabe 6.8Schreibe ein Programm, das den Durchschnitt von drei eingelesenen Zahlen berechnet. Teste es mit den Werten 3, 4 und 5 sowie mit 0, 0 und 0. Beschreibe, warum solche Testfälle wichtig sind und welchen Testfall du zusätzlich wählen würdest.
Zusatzaufgabe 6.9Suche im Internet nach der Fehlermeldung
IndentationErrorund finde heraus, wodurch sie entsteht. Baue ein Programm, das genau diesen Fehler auslöst.