Python Errors Fehler Error Lösungen

 Fehler und Ausnahmen

 

Fehler gehören für Programmierer zum Alltag: Komplexe Computerprogramme laufen nur selten fehlerfrei, schon gar nicht in der Entwicklungsphase. Die möglichen auftretenden Fehler lassen sich allgemein in drei Arten unterteilen:

 

Arten von Programm-Fehlern

  • Syntax-Fehler bewirken, dass ein Programm aufgrund eines “Grammatik-Fehlers” vom Computer nicht in ausführbaren Maschinencode übersetzt werden kann. Derartige Fehler können aus unvollständigen Klammerpaaren, fehlenden Doppelpunkt-Zeichen am Ende einer if-Bedingung, ungültige Zeichen oder ähnlichem bestehen. Enthält ein Programm Syntax-Fehler, so werden diese beim Versuch eines Programmaufrufs angezeigt, und das Programm startet nicht.

    Die zwei geläufigsten Syntax-Checker für Python-Code sind pylint und pyflakes; zudem gibt es einen “Style”-Checker namens pep8, der prüft, ob die offiziellen Empfehlung für das Aussehen von Python-Code eingehalten werden (beispielsweise keine Zeilen mit mehr als 80 Zeichen auftreten).

    Gibt man nach der Installation pylint skriptname.py ein, so werden einerseits darin möglicherweise enthaltene Syntax-Fehler aufgelistet, andererseits werden Empfehlungen zur Verbesserung der Code-Syntax gegeben – unter anderem wird darauf hingewiesen, wenn eine Funktionsdefinition keinen Docstring enthält.

  • Laufzeit-Fehler treten auf, wenn ein Programm versucht, eine ungültige Operation durchzuführen, beispielsweise eine Division durch Null oder ein Öffnen einer nicht vorhandenen Datei. Laufzeit-Fehler treten also erst auf, wenn das Programm (in der Regel ohne Fehlermeldung) bereits läuft.

    Laufzeit-Fehler können in Python allgemein mittels try-except-Konstrukten abgefangen werden.

  • Logische Fehler / semantische Fehler treten auf, wenn ein Programm zwar (anscheinend) fehlerfrei funktioniert, jedoch andere Ergebnisse liefert als erwartet. Bei solchen Fehlern liegt das Problem also an einem Denkfehler des Programmierers.

    Logische Fehler sind oft schwer zu finden; am besten hilft hierbei ein Debugger, mit dem man den Programmablauf Schritt für Schritt nachvollziehen kann .

Tritt in einem Python-Programm ein Fehler auf, der nicht von einer entsprechenden Routine abgefangen wird, so wird das Progarmm beendet und ein so genannter “Traceback” angezeigt. Bei dieser Art von Fehlermeldung, die man von unten nach oben lesen sollte, wird als logische Aufruf-Struktur angezeigt, welche Funktion beziehungsweise Stelle im Programm den Fehler verursacht hat; für diese Stelle wird explizit der Dateiname und die Zeilennummer angegeben.

Tritt eine Ausnahme (=Fehler) auf werden folgnde Informationen in der Shell ausgegeben:

  • Eine Beschreibung des Ortes im Programmtext, wo der Fehler auftrat (aufgerufene Fuktion, Zeilennummer)
  • Name der Exception, dh. der Ausnahmetyp (z.B TypeError)
  • ein „assoziierter Wert“ – in der Regel eine kurze Eläuterung des Fehlers

Beispielfehler

can’t assign to operator = kann dem Operator nicht zugewiesen werden. Die Fehlermeldung erscheint, da Python den Bindestrich in der Variable us-groesse  als Minus interpretiert. Variablennamen können als Option  mit Unterstrich geschrieben werden.

invalid syntax ein Fehler in der Syntax ( =grammatische Regeln ) Wurde eine Klammer oder ein Anführungszeichen vergessen? Wurden 2 gleiche Anführungszeichen  oder Klammern verwendet? Gibt es einen Tippfehler?

 


Im Beispiel fehlt der Doppelpunkt hinter „ende“

 

unexpected EOF while parsing =  unerwartete EOF beim Parsen , – der Befehl wurde nicht geschlossen. Im Beispiel fehlt die abschliessende Klammer  )

Ein sehr häufiger Fehlertyp wird als NameError bezeichnet und tritt auf, wenn Sie versuchen, eine Variable zu verwenden, die nicht existiert. 

fridolin@localhost ~ $ python3
Python 3.5.5 (default, Apr 19 2018, 16:28:00) 
[GCC 6.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> print ("ich wohne in " + stadt)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'stadt' is not defined
>>> 

Variablennamenfehler gehören zu den aussagekräftigsten Fehlermeldungen, die normalerweise in der Form ‘the_variable_name’ is not defined” ausgegeben wird.

Eine mögliche Ursache ist,  dass Sie eine Zeichenkette verwenden wollen, aber vergessen haben, sie in Anführungszeichen zu setzen (hello muss in Anführungszeichen geschrieben werden .

print (hello)

---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-8-9553ee03b645> in <module>()
----> 1 print(hello)

NameError: name 'hello' is not defined


Das zweite kann sein, dass Sie vergessen haben, die Variable zu erstellen, bevor Sie sie verwenden. Im folgenden Beispiel sollte stadt  definiert sein

fridolin@localhost ~ $ python3
Python 3.5.5 (default, Apr 19 2018, 16:28:00) 
[GCC 6.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> print ("ich wohne in " + stadt)

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'stadt' is not defined
>>> 

Die dritte Möglichkeit besteht schließlich darin, dass Sie einen Tippfehler gemacht haben, als Sie Ihren Code geschrieben haben. Denken Sie daran, dass bei Variablen die Groß- / Kleinschreibung beachtet wird, sodass sich die Variable stadt von der Variable Stadt unterscheidet.

IndentationError: expected an indented block oder unexpected indent

indentation error – Falscher Einzug
Python kennzeichnet Beginn und Ende von Codeblöcken, indem es die Zeilen einrückt. Sind sie falsch eingerückt ist der Code nicht richtig struckturiert. Wenn eine Codezeile mit : endet, muss die folgende Zeile eingerückt sein ( einmal Tab oder 4 Leerzeichen)
 

 

 

fridolin@localhost ~ $ python3
Python 3.5.5 (default, Apr 19 2018, 16:28:00)
[GCC 6.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 1+2
3
>>> 'Abend'+'rot'
'Abendrot'
>>> '1'+2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly
>>>

input in Python 3 ist wie raw_input in Python 2: es konvertiert nicht.  Es werden erst Zahlen addiert, dann Textfolgen zusammengefügt. Im 3. Fall ist 1 keine Zahl, da sie in Anführungszeichen steht. Ein Zusammenfügen von Text mit Zahlen ist nicht möglich.

i=int(30)
n=int(20)
for i in range(n):
print ('Reihe',i)

SyntaxError- EOL while scanning string literal

EOL Fehler :

EndofFile Fehler – weisen auf eine fehlende Klammer oder fehlendes Anführungszeichen hin. Oft ist der Befehlssatz nicht korrekt geschlossen.

 IOError
Eine Datei kann nur geöffnet werden, wenn sie tatsächlich existiert und die Rechte so gesetzt sind, dass das Programm zugreifen darf, sonst gibt es einen IOError  ( InputOutputError) .

ValueError: invalid Literal – es wurde eine falsche Art von Daten übergeben. Zum Biepsiel wurde ein Text-String an ein int() übergeben.

 

TypeError: unsupported type(s) for /: ’str‘ and ‚int‘ – TypeError: Nicht unterstützte Typen für /: ’str‘ und ‚int‘

print ("Bitte geben Sie die deutsche Größe ein")
schuhgroesse=input()
schuhgr_us=schuhgroesse / 6
print schuhgr_us
Missing paranthese in call to print

Diese Fehlermeldung weist auf eine fehlende Klammer hin. Der 2, print Befehl hat keine Klammern. Korrekt ist print (schuhgr_us)

Invalid Literal

ValueError: invalid literal for int() with base 10: ‚ eins‘
>>>

Hier wurde ein String bzw. eine Zeichenkette  (eins) statt einer Zahl (1) eingegeben. Durch die Festlegung der Variablen Zahl als int (integer) muss eine Ziffer eingegeben werden.

 

Traceback (most recent call last):
File "/home/fridolin/python/tkinter2.py", line 4, in <module>
logo = PhotoImage(file="pinguin.jpg")
File "/usr/lib64/python3.5/tkinter/__init__.py", line 3402, in __init__
Image.__init__(self, 'photo', name, cnf, master, **kw)
File "/usr/lib64/python3.5/tkinter/__init__.py", line 3358, in __init__
self.tk.call(('image', 'create', imgtype, name,) + options)
_tkinter.TclError: couldn't recognize data in image file "pinguin.jpg"
>>>

Diese Fehlermeldung erscheint, da TK kein jpg unterstützt . Es unterstützt nur .gif  Dateien.

 

UnboundLocalError: local variable ‚x‘ referenced before assignment – weist auf einen Fehler im Namensraum hin.

 

Es wurde eine Schleife mit while begonnen und geschlossen. Durch die Wegnahme der Einrückung. Wenn mit der Schleife weitergearbeitet werden soll muss die Einrückung weiterhin geschehen. Also antwort = input etc und if antwort etc müssen noch eingerückt sein.
 
Korekt ist es so:
 
 
>>> s = 'foobar'
>>> s[3] = 'x'
Traceback (most recent call last):
  File "<pyshell#40>", line 1, in <module>
    s[3] = 'x'
TypeError: 'str' object does not support item assignment

Zeichenfolgen sind einer der Datentypen, die Python als unveränderlich betrachtet, dh nicht geändert werden können.

 

Der Versuch, über das Ende einer Zeichenfolge hinaus zu indizieren, führt zu einem Fehler:

>Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    s[6]
IndexError: string index out of range

(Slice-Indizes werden automatisch abgeschnitten, damit sie in den zulässigen Bereich fallen. Wenn ein Index keine Ganzzahl ist, wird TypeError ausgelöst.)

>>> deutsch={'key':'Schlüssel'}
>>> deutsch ['key']
'Schlüssel'
>>> deutsch ['nixda']
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
deutsch ['nixda']
KeyError: 'nixda'
>>>

Ein Key Error erscheint, wenn ein Eintrag nicht im Dictonary enthalten ist.

Traceback (most recent call last):
File "/home/fridolin/python/tkinter/tkinter2.py", line 1, in <module>
from Tkinter import *
ImportError: No module named 'Tkinter'

Das Modul wurde  nicht gefunden. Hier aufgrund dessen, dass  in Python2 Tkinter am Anfang groß geschrieben wurde. Ab Python 3 wird es klein geschrieben (tkinter)Der Fehler wird auch ausgelöst, wenn None in sys.modules gefunden wird.

Ausnahme AttributError
Wird ausgelöst, wenn ein Attributverweis  oder eine Zuweisung fehlschlägt. (Wenn ein Objekt Attributreferenzen oder Attributzuweisungen überhaupt nicht unterstützt, wird  TypeError ausgelöst.)

Der Primärwert muss für ein Objekt eines Typs ausgewertet werden, der Attributreferenzen unterstützt, z. B. ein Modul, eine Liste oder eine Instanz. Dieses Objekt wird dann aufgefordert, das Attribut zu erzeugen, dessen Name die Kennung ist. Wenn dieses Attribut nicht verfügbar ist, wird die Ausnahme AttributeError ausgelöst. Andernfalls wird Art und Wert des produzierten Objekts vom Objekt bestimmt. Mehrere Auswertungen derselben Attributreferenz können unterschiedliche Objekte ergeben. Das heißt, wenn wir versuchen, auf die gleichen Attribute eines anderen Objekttyps zuzugreifen, könnten wir Python veranlassen, einen Fehler an uns zurückzuschicken. Wenn wir beispielsweise versuchen, das append-Attribut einer ganzen Zahl zu verwenden, erhalten wir einen AttributeError, weil Objekte vom Typ integer dieses Attribut nicht besitzen:

>>> anInt = 8
>>> anInt.append (4) # Whoops!
Traceback (letzter Aufruf zuletzt):
Datei "<stdin>", Zeile 1, in <module>
AttributeError: 'int' Objekt has no attribute 'append'

AttributeError: Integers cannot 'append'.

Ausnahme ArithmeticError
Die Basisklasse für die integrierten Ausnahmen, die für verschiedene arithmetische Fehler ausgelöst werden: OverflowError, ZeroDivisionError, FloatingPointError.

Ausnahme OverflowError
Wird ausgelöst, wenn das Ergebnis einer arithmetischen Operation zu groß ist, um dargestellt zu werden. Dies kann nicht für ganze Zahlen auftreten (was eher MemoryError auslösen würde als aufgeben). Aus historischen Gründen wird OverflowError jedoch manchmal für Ganzzahlen ausgelöst, die sich außerhalb eines erforderlichen Bereichs befinden.

Ausnahme ZeroDivisionError
Wird ausgelöst, wenn das zweite Argument einer Divisions- oder Modulooperation null ist. Der zugehörige Wert ist eine Zeichenfolge, die den Typ der Operanden und die Operation angibt.

Ausnahme KeyboardInterrupt
Wird ausgelöst, wenn der Benutzer die Interrupt-Taste drückt (normalerweise Strg-C oder Löschen). Während der Ausführung wird regelmäßig nach Interrupts gesucht
Ausnahme

RuntimeError
Wird ausgelöst, wenn ein Fehler erkannt wird, der nicht in eine der anderen Kategorien fällt. Der zugehörige Wert ist eine Zeichenfolge, die angibt, was genau falsch gelaufen ist.

Python 3.5.5 (default, Apr 19 2018, 16:28:00)
[GCC 6.4.0] on linux
Type "copyright", "credits" or "license()" for more information.
>>>
======= RESTART: /home/fridolin/python/uebung/uebung-tkinter-viedo.py =======
Traceback (most recent call last):
File "/home/fridolin/python/uebung/uebung-tkinter-viedo.py", line 4, in <module>
root = Tk()
NameError: name 'Tk' is not defined
>>>

NameError: name ‚Tk‘ is not defined – dieser Fehler kommt, da das Modul tkinter import tiert wurde aber nicht angegbene, dass ich es nur als ik bezeichnen möchte. Durch die Angabe „import tkinter as Tk“ wird dieser Fehler behoben.

Python: IndentationError: unindent does not match any outer indentation level

Zu diesem Fehler kommt es, wenn man Leerzeichen und Tabs mixt. Am besten man behält Kontrolle über die Syntax, indem man einen Editor benutzt, der Tabs anzeigt. Dies ist der Edior Geany. Er ist auf den meisten Distributionen nicht automatisch installiert. Hier sieht man gut die Tab-Einrückungen.

 

OverflowError: integer addition : Das Problem besteht darin, dass diese Zahl zu groß ist um in eine Python-Ganzzahl, int, hineinzupassen.