Python „Fehler im Code“ - luis.uni-hannover.de · Programmiersprache Python Seite 3...
Transcript of Python „Fehler im Code“ - luis.uni-hannover.de · Programmiersprache Python Seite 3...
Anja Aue | 07.09.16
Python„Fehler im Code“
Java - Einführung | 06.05.15 Seite 2
Softwarefehler
Programmierfehler entstehen beim Schreiben des Programmcodes. Der Code entspricht nicht der Syntax der Programmiersprache.
Logische Fehler können durch Denkfehler bei der Umsetzung der Aufgabe in ein Programm erzeugt werden. Das Programm wird fehlerfrei ausgeführt, aber das Ergebnis ist nicht korrekt.
Laufzeitfehler treten während der Ausführung des Programms auf. Zum Beispiel ist eine Datei nicht an dem angegebenen Speicherort abgelegt. Eine Division durch Null wirft einen Fehler.
Programmiersprache Python Seite 3
Syntaxfehler
Verstoß gegen die Regeln einer Programmiersprache. Verletzung der Syntax einer Programmiersprache. Ein Ausdruck oder eine Anweisung hat einen falschen
Datentyp. Sobald ein Syntaxfehler auftritt, wird die Ausführung des
Programms durch den Interpreter abgebrochen.
Programmiersprache Python Seite 4
Beispiele
Tippfehler bei der Eingabe von Variablennamen oder Schlüsselwörtern.
Mischung von numerischen und nicht-numerischen Operatoren.
Syntaxfehler in Schleifen oder bedingten Anweisungen. Falsche Übergabe von Parametern.
Programmiersprache Python Seite 5
… bei der Eingabe von Code in der Shell
In der Shell wird jede Anweisung (Zeile) durch die Eingabetaste <Return> abgeschlossen.
Der Code wird sofort interpretiert und ein auftretender Syntaxfehler in der nächsten Zeile angezeigt.
Programmiersprache Python Seite 6
Informationen zu einem Syntaxfehler
In der Shell beginnt jeder Syntaxfehler mit dem Präfix SyntaxError und dem Doppelpunkt.
Dem Doppelpunkt folgt eine Beschreibung des Fehlers. Entsprechend des verursachten Syntaxfehlers wird eine Meldung ausgegeben.
SyntaxError : EOL while scanning string literal
Fehlertyp : Fehlermeldung
Programmiersprache Python Seite 7
… bei der Eingabe von Code in den Editor
Programmiersprache Python Seite 8
Erläuterung
Das Programm wird mit Run – Run Module (F5) gestartet. Jede Zeile wird vom Interpreter entsprechend ausgeführt. Sobald ein Syntaxfehler auftritt, wird ein Dialog eingeblendet. In der Titelleiste des Dialogs wird die Art des Fehlers
angezeigt. Im Dialog selber wird die passende Fehlermeldung angezeigt. Die Fehlermeldung wird mit OK bestätigt.
Im Code selber wird die Zeile, die den Fehler verursacht hat, farbig markiert. Die Einfügemarke wird in die entsprechende Zeile gesetzt.
Programmiersprache Python Seite 9
Fehler: Falsche Einrückung
Falls Anweisungen nicht korrekt eingerückt sind, wird der Fehler unexpected indent angezeigt.
Programmiersprache Python Seite 10
Hinweise
Anweisungen können in verschiedenen Einrücktiefen vorkommen.
Anweisungen auf der obersten Ebene werden nicht eingerückt.
if-Anweisungen oder Schleifen auf der obersten Ebene stellen „Ordner“ dar, die Anweisungen darunter zusammenfassen. Anweisungen werden entsprechend der Zuordnung zu einer bedingten Anweisung oder Schleife eingerückt.
Falls if-Anweisungen oder Schleifen verschachtelt sind, verschiebt sich die dazugehörige Anweisung um eine Ebene.
Programmiersprache Python Seite 11
Fehler: Leerer Anweisungsblock
Jede bedingte Anweisung oder Schleife benötigt mindestens eine Anweisung im Rumpf.
Falls diese nicht vorhanden ist, wird der Fehler expected an indented block angezeigt.
Java - Einführung | 06.05.15 Seite 12
Leerer Anweisung
Das Schlüsselwort pass symbolisiert eine leere Anweisung.
zahlL = zahlMin
for zahlL in range(zahlMin, zahlMax + 1): zahlR = zahlMin for zahlR in range(zahlMin, zahlMax + 1): pass
Java - Einführung | 06.05.15 Seite 13
Logische Fehler
Treten bei der Ausführung der Software auf. Falsche Berechnung von Werten. Fehlerhaftes Design der Software. Falsche Nutzung durch den Benutzer.
Java - Einführung | 06.05.15 Seite 14
Strategien
Testen des Programms mit Hilfe des Debuggers. Der Entwickler kann Zeilen, die in Verdacht stehen einen
Fehler zu verursachen, auskommentieren. Falls das Programm anschließend fehlerfrei läuft, ist der Fehler lokalisiert und kann behoben werden.
Nach einem erfolgreichen Test wird das Programm gespeichert. Für die Weiterentwicklung wird die Programmdatei kopiert. Falls Fehler nicht gefunden werden, kann auf eine alte fehlerfreie Version zurückgegriffen werden.
Java - Einführung | 06.05.15 Seite 15
Debuggen von Code
Der Debugger wird in der Shell gestartet (Debug – Debugger). In der Shell wird der Hinweis [Debug ON] angezeigt.
Anschließend wird das Programm im Editor gestartet (Run – Run Module).
Im Debugger wird die erste Zeile des Codes angezeigt.
Java - Einführung | 06.05.15 Seite 16
Debugger
Java - Einführung | 06.05.15 Seite 17
Schaltfläche am oberen Rand
Go. Ab der auszuführenden Anweisung wird das Programm vollständig oder bis zum nächsten Haltepunkt durchlaufen.
Step. Zeilenweise wird das Programm ausgeführt. Over. Das Programm führt die nächste Anweisung aus. Falls
eine Funktion aufgerufen wird, wird nicht in diese hineingesprungen. Der Aufruf der Funktion wird aber ausgeführt.
Out. Das Programm durchläuft die aktuelle Funktion vollständig.
Quit. Der Debugger wird beendet.
Programmiersprache Python Seite 18
Kontrollkästchen zum Anzeigen von Informationen
Stack blendet das Textfenster ein und aus. In dem Fenster werden die aktuell auszuführenden Anweisungen angezeigt.
Locals zeigt die lokalen Variablen am unteren Rand an. Globals zeigt die globalen Variablen des Programm am unteren
Rand an. Source zeigt im Quellcode die aktuell auszuführende Zeile an.
Programmiersprache Python Seite 19
Lokale Variablen
Variablen, die mit zwei Unterstrichen beginnen, sind von Python vordefinierte Variablen. Die Variable __name__ gibt den Namen des aktuellen Moduls an.
Programmiersprache Python Seite 20
Haltepunkte
Farbige Markierungen im Code. Die Ausführung eines Programms wird im Debug-Modus an
einem Haltepunkt unterbrochen.
Programmiersprache Python Seite 21
… setzen
Rechter Mausklick auf die gewünschte Anweisung im Editor. Im Kontextmenü wird der Befehl Set Breakpoint ausgewählt.
Programmiersprache Python Seite 22
… löschen
Rechter Mausklick auf die gewünschte Anweisung im Editor. Im Kontextmenü wird der Befehl Clear Breakpoint ausgewählt.
Java - Einführung | 06.05.15 Seite 23
Laufzeitfehler
Ausdrücke oder Anweisungen werden vom Programm nicht korrekt ausgewertet.
Fehler, die zur Laufzeit des Programms, ein nicht erwünschtes Verhalten des Programms erzeugen.
Das Programm kann abstürzen.
Java - Einführung | 06.05.15 Seite 24
Beispiele für Laufzeitfehler
Division durch Null. Falsche Verwendung von Operanden und / oder Operatoren. Endlosschleife Ein- und Ausgabefehler.
Programmiersprache Python Seite 25
Anzeige in der Shell
Welcher Laufzeitfehler ist aufgetreten? In diesem Beispiel ist ein TypeError aufgetreten.
Programmiersprache Python Seite 26
… in einer Code-Datei verursacht
Programmiersprache Python Seite 27
Informationen zum Fehler
Dem Wort Traceback folgt die Beschreibung des verursachten Laufzeitfehlers.
Dem Wort File folgt die Bezeichnung und Speicherort der Datei, die den Fehler verursacht hat.
Dem Wort line folgt die Zeilenangabe, in der der Laufzeitfehler in der angegebenen Datei aufgetreten ist.
Darunter wird der Fehlertyp und die Fehlermeldung angezeigt.
Programmiersprache Python Seite 28
Sprung zum Fehler
Mit der rechten Maustaste wird auf das Wort line geklickt. Im geöffneten Kontextmenü wird der Befehl Go to File / Line
ausgeführt. Entsprechend der Angaben wird zu der Zeile in der Code-
Datei gesprungen, die den Laufzeitfehler auslöst.
Java - Einführung | 06.05.15 Seite 29
Exception
Ausnahme von der Regel. Fehler, die zur Laufzeit des Programms auftreten können. Fehler, die im Code abgefangen und repariert werden
können.
Java - Einführung | 06.05.15 Seite 30
Informationen im Web
https://docs.python.org/3/library/exceptions.html http://www.tutorialspoint.com/python/standard_exceptions.htm http://www.python-kurs.eu/ausnahmebehandlung.php
Programmiersprache Python Seite 31
Exception „Division durch Null“
beispiel\kapitel08_Fehler\zeroDivisionError.py
zahlL = 4zahlR = 0
ergebnis = zahlL / zahlR
Programmiersprache Python Seite 32
Exception-Handling
be
isp
iel\k
ap
itel0
8_
Fe
hle
r\ze
roD
ivis
ion
Err
or.
py
zahlL = 4zahlR = 0ergebnis = 0
try: ergebnis = zahlL / zahlR
except ZeroDivisionError: print("Eine Division durch Null ist nicht erlaubt.")
except: print("Ein unbekannter Fehler ist aufgetreten")
else: print("Ergebnis der Division: ", ergebnis)
C++ - Einführung | 06.05.15 Seite 33
Aufbau
try: ergebnis = zahlL / zahlR
except ZeroDivisionError: print("Division durch Null.")
Versuche
Abfangen von speziellen Fehlern
except: print("Allgemeiner Laufzeitfehler")
Abfangen von allen anderen Fehlern
else: print("Kein Fehler")
Wenn kein Fehler aufgetreten ist ...
finally: print("Egal")
Wird immer ausgeführt
Java - Einführung | 06.05.15 Seite 34
Versuche die Anweisungen auszuführen
Beginn mit dem Schlüsselwort try. Dem Schlüsselwort folgt der Doppelpunkt. In der nächsten
Zeile beginnt der, zu dem Befehl gehörende Codeblock. In dem Codeblock können Laufzeitfehler auftreten, müssen
aber nicht.
try: ergebnis = zahlL / zahlR
Java - Einführung | 06.05.15 Seite 35
Abfangen aller Laufzeitfehler
Dem Schlüsselwort except folgt der Doppelpunkt. In der nächsten Zeile beginnt der, zu dem Befehl gehörende Codeblock.
Der Codeblock fängt alle Laufzeitfehler ab.
try: ergebnis = zahlL / zahlR
except: print("Ein unbekannter Fehler ist aufgetreten")
Java - Einführung | 06.05.15 Seite 36
Ablauf
for zahl in zahlen:
try: index = index + 1 ergebnis = zahl / zahlen[index]
except: print("Laufzeitfehler") break
Versuche die Anweisungen auszuführen
Falls ein Fehler auftritt
Java - Einführung | 06.05.15 Seite 37
Spezifizierung von Exceptions
Dem Schlüsselwort except folgt der Name des abzufangenden Laufzeitfehlers.
In diesem Beispiel wird die Standard-Exception ZeroDivisionError abgefangen. Der Fehler ZeroDivisionError: division by zero wird durch diese Anweisung abgefangen.
try: ergebnis = zahlL / zahlR
except ZeroDivisionError: print("Eine Division durch Null ist nicht erlaubt.")
Java - Einführung | 06.05.15 Seite 38
Erläuterung
Dem Befehl except kann der Name eines Laufzeitfehlers folgen, muss aber nicht.
Als Name kann die Bezeichnung einer Standard-Exception oder selbstdefinierte Fehler genutzt werden.
except ZeroDivisionError :
except :
except Name :
Java - Einführung | 06.05.15 Seite 39
Reihenfolge von except-Anweisungen
try: ergebnis = zahlL / zahlR
except ZeroDivisionError: print("Eine Division durch Null ist nicht erlaubt.")
except: print("Ein unbekannter Fehler ist aufgetreten")
Genera lisierun g
Spezial isierung
Java - Einführung | 06.05.15 Seite 40
Hinweise
Jedem Befehl try muss mindestens eine except-Anweisung folgen. Andernfalls wird der Syntaxfehler unexected EOF while parsing angezeigt.
try-Anweisungen können verschachtelt werden. Entsprechend der Einrücktiefe werden den try-Anweisungen except-Anweisung zugeordnet.
Java - Einführung | 06.05.15 Seite 41
Falls kein Laufzeitfehler auftritt
Dem Befehl else folgt der Doppelpunkt. In der nächsten Zeile wird der dazugehörige Codeblock eingerückt angezeigt.
Der Codeblock wird nur ausgeführt, wenn keine Laufzeitfehler aufgetreten ist.
Der else-Zweig ist optional.
try: ergebnis = zahlL / zahlR
else: print("Ergebnis der Division: ", ergebnis)
Java - Einführung | 06.05.15 Seite 42
Finale ...
Dem Befehl finally folgt der Doppelpunkt. In der nächsten Zeile wird der dazugehörige Codeblock eingerückt angezeigt.
Der Codeblock wird immer ausgeführt, egal ob Fehler aufgetreten sind oder nicht. In diesem Block werden Aufräumarbeiten ausgeführt.
Der finally-Zweig ist optional.
try: ergebnis = zahlL / zahlR
finally: print("… bis zum Index {} durchlaufen.".format(index))
Java - Einführung | 06.05.15 Seite 43
ZeroDivisionError
ArithmeticError TypeError
Hierarchie der Standard-Exceptions (Ausschnitt)
IndexError KeyError
NameError ValueError LookupError
Exception
BaseException
Java - Einführung | 06.05.15 Seite 44
Exception „ZeroDivisionError“
zahlen = [1, 2, 3, 4, 5, 0, 6, 7, 9, 0]ergebnis = 0index = 0
for zahl in zahlen: try: index = index + 1 ergebnis = zahl / zahlen[index]
except ZeroDivisionError: print("Eine Division durch Null ist nicht erlaubt.") break
Java - Einführung | 06.05.15 Seite 45
Exception „ValueError“
Einer Funktion oder Methode werden Argumente übergeben. Das Argument hat den richtigen Datentyp, aber einen fehlerbehafteten Wert.
Das Argument kann nicht entsprechend der Konvertierungsfunktion interpretiert werden.
Probleme bei der Kodierung von Unicode-Zeichen.
Java - Einführung | 06.05.15 Seite 46
… bei der Konvertierung von Strings
Fehlermeldung bei Gleitkommazahlen ValueError: could not convert string to float:.
Fehlermeldung bei Ganzzahlen: invalid literal for int() with base 10:.
strTemperatur = input("Bitte geben Sie die Temperatur ein: ")
try: temperatur = float(strTemperatur)
except ValueError: print("Falsche Eingabe. Bitte geben Sie eine Gleitkommazahl ein.")
Java - Einführung | 06.05.15 Seite 47
… bei Sequenzen
Löschung von Elementen, die nicht in der Liste gespeichert sind.
Fehlermeldung: ValueError: list.remove(x): x not in list
buchstaben = ['a', 'b', 'c', 'd']
try: buchstaben.remove('e') except ValueError: print("Das Element ist in der Liste nicht vorhanden")
Java - Einführung | 06.05.15 Seite 48
Exception „TypeError“
Die Variable kann nicht entsprechend der gewünschten Aktion interpretiert werden.
In diesem Beispiel wird der Fehler TypeError: unsupported operand type(s) for +: 'int' and 'str' geworfen.
summe = 0ausgabe = ''
try: summe = 5 + 6 ausgabe = 5 + ' + ' + 6 + ' = ' + summe except TypeError: print("Für den Operanden wird der falsche Typ genutzt")
Java - Einführung | 06.05.15 Seite 49
Exception „NameError“
Ein Name wird nicht gefunden. Variablen wurden vor der Nutzung nicht deklariert und
initialisiert. Methoden werden als Funktionen aufgerufen.
Java - Einführung | 06.05.15 Seite 50
… bei Variablen
In diesem Beispiel wird der Fehler NameError: name 'zahlR' is not defined geworfen.
Eine Variable muss vor ihrer Nutzung deklariert und initialisiert werden.
zahlL = 5
try: summe = zahlL + zahlR
except NameError: print("Eine der Variablen ist nicht definiert.")
Java - Einführung | 06.05.15 Seite 51
… bei nicht definierten Methoden / Funktionen
In diesem Beispiel wird der Fehler NameError: name 'count' is not defined geworfen.
Eine Funktion / Methode muss vor ihrer Nutzung deklariert und initialisiert werden.
buchstaben = ['a', 'b', 'c', 'd']
try: if count(buchstaben) > 0: del buchstaben[len(buchstaben) - 1]
except NameError: print("Die Funktion oder die Variable ist nicht definiert.")
Java - Einführung | 06.05.15 Seite 52
Exception „IndexError“ bei Strings und Sequenzen
buchstaben = ['a', 'b', 'c', 'd']lastIndex = len(buchstaben)index = 0
try: while(index <= lastIndex): print(buchstaben[index]) index += 1
except IndexError: print("Die Unter- oder Obergrenze wurde überschritten.")
Java - Einführung | 06.05.15 Seite 53
Exception „KeyError“ bei Wörterbüchern
farbe = {'rot':255, 'gruen':0, 'blau':0}
try: farbton = farbe["gelb"]
except KeyError: print("Der Schlüssel ist nicht vorhanden")
Java - Einführung | 06.05.15 Seite 54
Exception „IOError“
try: datei = open('adrese.csv', 'r')
except IOError: print("Die Datei ... konnte nicht geöffnet werden.")
else: strZeile = datei.readline()
while strZeile: listeAdresse.append(strZeile.split(';')) strZeile = datei.readline()
datei.close()
Java - Einführung | 06.05.15 Seite 55
Informationen zu einem Fehler
import sys
strZahlL = input("Bitte geben Sie eine Ganzzahl ein: ")strZahlR = input("Bitte geben Sie den Vergleichswert ein: ")
try: zahlL = int(strZahlL) zahlR = int(strZahlR)
except: print("Error-Type: ", sys.exc_info()[0]) print("Error-Wert / Beschreibung: ", sys.exc_info()[1]) print("Traceback: ", sys.exc_info()[2])
Java - Einführung | 06.05.15 Seite 56
Module
Zusammenfassung von Codeblöcken zu einem Thema. Zum Beispiel enthält das Modul sys systemspezifische
Funktionen. Einige Module wie sys werden automatisch mit der
Programmiersprache Python installiert. Andere müssen gesondert installiert werden.
Java - Einführung | 06.05.15 Seite 57
… importieren
Bekanntmachung von Modulen. Im Anschluss an die Shebang-Zeilen werden die, in dem
Code benötigten Module importiert. Dem Befehl import folgt der Name des Moduls. Alle, in dem Module definierten Methoden / Funktionen und
Konstanten können in der Code-Datei, in das Modul eingebunden ist, genutzt werden.
import sys
Java - Einführung | 06.05.15 Seite 58
Funktion „exc_info“
Der Funktion werden keine Argumente übergeben. Die Klammern sind leer.
Die Funktion gibt ein Tupel zurück. Das Tupel enthält Informationen zu dem geworfenen Laufzeitfehler.
exceptionTupel = sys.exc_info()
Programmiersprache Python Seite 59
Welche Version wird genutzt?
Die Bibliothek sys wird mit Hilfe des Schlüsselwortes import geladen.
Die schreibgeschützte Liste version_info gibt Auskunft über die genutzte Version.
Die Liste version_info ist in der Bibliothek sys definiert. Bibliothek und Liste werden mit einem Punkt verbunden.
>>> import sys>>> sys.version_infosys.version_info(major=3, minor=5, micro=2, releaselevel='final', serial=0)
Java - Einführung | 06.05.15 Seite 60
Informationen zu Fehlern
exceptionTupel = sys.exc_info()
Die Bibliothek sys ist im Code eingebunden. Die Methode exc_info gibt Auskunft über den Ausnahmefehler. Die Methode exc_info ist in der Bibliothek sys definiert.
Bibliothek und Methode werden mit einem Punkt verbunden.
Java - Einführung | 06.05.15 Seite 61
Rückgabewert der Methode .exc_info()
Die Methode gibt ein Tupel zurück. Das Element hat drei Elemente. Durch Angabe eines Index
kann die Information in den verschiedenen Elementen gelesen werden.
Der Index wird in eckige Klammern angegeben. Das erste Element hat den Index 0 und so weiter.
exceptionTupel = sys.exc_info()print("Error-Type: ", exceptionTupel[0])print("Error-Wert / Beschreibung: ", exceptionTupel[1])print("Traceback: ", exceptionTupel[2])
Java - Einführung | 06.05.15 Seite 62
1. Element des Tupels: Fehlertyp
Welcher Fehlertyp ist aufgetreten? Jeder Name einer Standard-Exception kann vorkommen. TypeError, ValueError etc. beschreiben verschiedene
Fehlertypen.
exceptionTupel = sys.exc_info()print("Error-Type: ", exceptionTupel[0])
Java - Einführung | 06.05.15 Seite 63
2. Element des Tupels: Fehlermeldung
Beschreibung des Fehlers. Hilfe zur Behebung des Fehlers. Zum Beispiel: could not convert string to float:
exceptionTupel = sys.exc_info()print("Error-Type: ", exceptionTupel[1])
Java - Einführung | 06.05.15 Seite 64
3. Element des Tupels: Traceback
Wo wurde der Fehler verursacht? Aus welchen Kontext heraus wurde der Fehler geworfen?
Mit Hilfe des Moduls traceback können Informationen in Bezug auf den Kontext ausgegeben werden.
In diesem Beispiel wird der Traceback von exceptionTupel[2] ausgegeben.
import traceback
exceptionTupel = sys.exc_info()print("Error-Type: ", exceptionTupel[2])traceback.print_tb(exceptionTupel[2])
Java - Einführung | 06.05.15 Seite 65
Exceptions ignorieren
buchstaben = ['a', 'b', 'c', 'd']
try: zeichen = input("Welches Zeichen möchten Sie löschen: ") buchstaben.remove(zeichen) except ValueError: pass except: print("Unbekannter Fehler"))
Java - Einführung | 06.05.15 Seite 66
Erläuterung
Das Schlüsselwort pass symbolisiert eine leere Anweisung. In dem Beispiel wird pass genutzt, um einen Laufzeitfehler
abzufangen und nicht zu behandeln.