20 typische Python-Fehler und wie du sie korrigierst!

von: Konstantin

aktualisiert: March 12, 2025

Wenn du mit Python anfängst, wirst du schnell auf Fehlermeldungen stoßen. Das ist normal! Die gute Nachricht: Viele dieser Fehler lassen sich leicht vermeiden oder beheben. Hier schauen wir uns die häufigsten Fehler an und zeigen dir, wie du sie debuggen kannst.

Inhalt
1. SyntaxError 2. IndentationError 2.1. Leerzeichen, Tabs, Einrückungstiefe 2.2. IndentationError nach Copy-Paste 2.3. Wie vermeidest du den IndentationError? 3. AttributeError 3.1. Häufige Ursachen für den AttributeError 3.2. Debugging des AttributeError 4. NameError 4.1. Häufige Ursachen für NameError 4.2. So debuggst du den NameError 5. IndexError 5.1. Häufige Ursachen für den IndexError 5.2. Debugging des IndexError 6. FileNotFoundError 6.1. Häufige Ursachen für FileNotFoundError 6.2. Debugging des FileNotFoundError 7. PermissionError 7.1. Häufige Ursachen für den PermissionError 7.2. Debugging des PermissionError 8. ValueError 8.1. Häufige Ursachen für den ValueError 8.2. ValueError vermeiden und debuggen 9. TypeError 9.1. Häufige Ursachen für den TypeError 9.2. TypeError vermeiden und debuggen 10. UnboundLocalError 10.1. Häufige Ursachen für UnboundLocalError 10.2. Wie du den UnboundLocalError vermeidest 11. UnicodeError 11.1. Häufige Ursachen für den UnicodeError 11.2. So vermeidest du den UnicodeError 12. MemoryError 12.1. Häufige Ursachen für den MemoryError 12.2. So debuggst du den MemoryError 13. ImportError und ModuleNotFoundError 13.1. Häufige Ursachen für den ImportError und ModuleNotFoundError 13.2. So verhinderst du den ImportError und ModuleNotFoundError 14. KeyError 14.1. Häufige Ursachen für den KeyError 14.2. So gehst du vor, um den KeyError zu debuggen 15. StopIterationError 15.1. Häufige Ursachen für StopIteration Error 15.2. So vermeidest du den StopIteration Fehler 16. OverflowError 16.1. Häufige Ursachen für den OverflowError 16.2. So vermeidest du den OverflowError 17. RecursionError 17.1. Wie viele Rekursionen sind erlaubt? 17.2. Alternativen zur Rekursion 17.3. So optimierst du rekursive Funktionen 17.4. Häufige Fehler bei der Rekursion 18. KeyboardInterrupt 18.1. KeyboardInterrupt mit try-except abfangen 18.2. Wie kann man ein Skript sicher beenden? 19. RuntimeError 19.1. Typische Ursachen für einen RuntimeError 19.2. Wie kannst du den RuntimeError vermeiden? 20. ZeroDivisionError 20.1. Ursachen für einen ZeroDivisionError 20.2. So vermeidest du den ZeroDivisionError

1. SyntaxError

Ein SyntaxError tritt auf, wenn Python auf einen Befehl stößt, den es nicht versteht. Das kann an Tippfehlern, fehlenden Zeichen oder einer falschen Struktur liegen. Python erwartet eine bestimmte Syntax – wenn diese verletzt wird, gibt es eine Fehlermeldung aus. Du solltest deinen Code nach folgenden möglichen Ursachen durchsuchen:

  • Strings, die nicht korrekt geschlossen wurden
  • Fehlende Klammern
  • Fehlende Anführungszeichen
  • Probleme mit korrekter Einrückung
  • Falsch geschriebene Python Befehle
  • Fehlender Doppelpunkt bei Schleifen, Funktionen oder Bedingungen
  • Verwechslung von = und ==

# Fehlende Klammer:
print("Hallo Welt"  

# Fehlermeldung:
SyntaxError: unexpected EOF while parsing

Strukturen wie if, for, while oder def benötigen am Ende der Zeile einen Doppelpunkt.

# Fehlender Doppelpunkt:
if True
    print("Ja")
        
# Fehlermeldung:
SyntaxError: expected ':'

# Korrektur:
if True:
    print("Ja")

2. IndentationError

Python nutzt Einrückungen, um Codeblöcke zu definieren. Das betrifft Schleifen, Bedingungen, Funktionen und andere Strukturen. Fehlt die richtige Einrückung oder ist sie inkonsistent, gibt Python einen IndentationError aus.

# Falsche Einrückung:
if True:
print("Hallo Welt")

# Fehlermeldung:
IndentationError: expected an indented block

# Korrektur:
if True:
    print("Hallo Welt")

Ebenso musst du bei der Definition von Funktionen auf die korrekte Einrückung achten:

# Falsche Einrückung:
def meine_funktion():
print("Hallo")

# Fehlermeldung:
IndentationError: expected an indented block

# Korrektur:
def meine_funktion():
    print("Hallo")

2.1. Leerzeichen, Tabs, Einrückungstiefe

Teilweise bekommst du Probleme, wenn du Einrückungen teils mit Tab, teils mit Leerzeichen einfügst. Das Problem kannst du sehr einfach lösen indem du dir entweder Tabs oder Leerzeichen für Einrückungen angewöhnst. Standard in Python sind 4 Leerzeichen pro Einrückung. Verwende außerdem immer die gleiche Einrückungstiefe für identische Code-Blöcke.

# Falsche Einrückung:
for i in range(5):
    print(i)
      print("Falsche Einrückung")
      
# Fehlermeldung:
IndentationError: unexpected indent

# Korrektur:
for i in range(5):
    print(i)
    print("Richtig eingerückt") 

2.2. IndentationError nach Copy-Paste

Oft bekommst du Probleme mit der korrekten Einrückung wenn du Code von Websiten oder anderen Editoren kopierst. Manche Editoren fügen unsichtbare Zeichen hinzu, die Python nicht mag. In diesem Fall solltest du alle Leerzeichen entfernen und die Einrückungen nochmal manuell korrigieren. Gerade um Einrückungsfehler zu vermeiden, solltest du den Code in einem guten Editor schreiben: VSCode, PyCharm und andere Editoren markieren Einrückungsfehler.

2.3. Wie vermeidest du den IndentationError?

Hier sind einige Tipps:

  • Benutze Leerzeichen statt Tabs (PEP 8 empfiehlt 4 Leerzeichen pro Einrückung).
  • Verwende einen einheitlichen Code-Editor (z. B. VS Code oder PyCharm).
  • Aktiviere in deinem Editor die Anzeige für unsichtbare Zeichen, um gemischte Einrückungen zu erkennen.

3. AttributeError

Ein AttributeError tritt auf, wenn du ein Attribut oder eine Methode eines Objekts aufrufst, die nicht existiert. Das kann passieren, wenn du dich vertippst, das falsche Objekt verwendest oder nicht bedenkst, dass ein Objekt bestimmte Methoden gar nicht hat.

Beispiel:

# Methode nicht verfügbar:
text = "Hallo Welt"
text.append("!")

# Fehlermeldung:
AttributeError: 'str' object has no attribute 'append'

Erklärung: Strings (str) haben keine append()-Methode. Diese gibt es nur bei Listen (list).

Probiere es mit einer Liste:

text = ["Hallo Welt"]
text.append("!")
print(text)

3.1. Häufige Ursachen für den AttributeError

Python-Objekte haben unterschiedliche Methoden und Attribute. Ein häufiger Fehler ist es, eine Methode aufzurufen, die für den jeweiligen Typ nicht existiert:

# Methode existiert nicht:
zahl = 42
zahl.upper()

# Fehlermeldung:
AttributeError: 'int' object has no attribute 'upper'

In diesem Fall macht die Methode upper() auch wenig Sinn. Überlege was du eigentlich machen wolltest und verwende gegebenenfalls den korrekten Objekttyp. 

Manchmal passiert es, dass eine Funktion None zurückgibt und du versuchst, darauf einen Methode aufzufrufen. Prüfe in diesem Fall, ob ein Objekt None ist, bevor du darauf zugreifst:

# Funktion gibt None zurück:
def finde_nutzer():
    return None

nutzer = finde_nutzer()
nutzer.name

# Fehlermeldung:
AttributeError: 'NoneType' object has no attribute 'name'

# Korrektur:
if nutzer is not None:
    print(nutzer.name)
else:
    print("Kein Nutzer gefunden.")

Weitere Ursachen für den AttributeError können sein:

  • Tippfehler wie z.B. text.uper() statt text.upper().
  • Eine Klasse hat das gesuchte Attribut einfach nicht.

3.2. Debugging des AttributeError

Wenn du einen AttributeError bekommst, folge diesen Schritten:

  1. Lies die Fehlermeldung – Sie zeigt dir, welches Objekt den Fehler verursacht.
  2. Überprüfe den Objekttyp – Nutze print(type(objekt)), um herauszufinden, womit du arbeitest.
  3. Nutze dir(objekt) – Diese Funktion zeigt dir alle verfügbaren Attribute eines Objekts.
  4. Prüfe, ob das Objekt None ist – Falls ja, kläre, warum es None ist.
  5. Korrigiere den Methodennamen – Ein Tippfehler kann leicht passieren.

4. NameError

Ein NameError ist einer der häufigsten Fehler in Python. Er tritt auf, wenn du versuchst, eine Variable oder Funktion zu verwenden, die Python nicht kennt. Definiere die Variable also vorher:

# Variable nicht definiert:
print(meine_variable)

# Fehlermeldung:
NameError: name 'meine_variable' is not defined

# Korrektur:
meine_variable = "Hallo Welt"
print(meine_variable)

4.1. Häufige Ursachen für NameError

Ein simpler Tippfehler kann zu einem NameError führen:

# Tippfehler:
zahl = 100
print(zalh)

# Fehlermeldung:
NameError: name 'zalh' is not defined

# Korrektur:
zahl = 100
print(zahl)

Möglicherweise ist die Variable innerhalb eines Scopes nicht verfügbar. Wenn eine Variable z.B. nur innerhalb einer Funktion existiert, aber außerhalb verwendet wird, entsteht ein NameError. In diesem Fall kannst du die Funktion so anpassen, dass sie die Variable zurückgibt:

# Lokale Variable:
def meine_funktion():
    x = 5

print(x)

# Fehlermeldung:
NameError: name 'x' is not defined

# Korrektur:
def meine_funktion():
    x = 5
    return x

x = meine_funktion()
print(x)

Wenn du eine Funktion aus einem Modul verwenden möchtest, aber das Modul nicht vorher importiert hast, kommt es zu einem NameError. Du musst das Modul vor der Verwendung importieren:

# math nicht importiert:
print(math.sqrt(25))

# Fehlermeldung:
NameError: name 'math' is not defined

# Korrektur:
import math
print(math.sqrt(25))

4.2. So debuggst du den NameError

Wenn du auf einen NameError stößt, folge diesen Schritten:

  1. Fehlermeldung genau lesen – Sie zeigt dir, welche Variable nicht definiert ist.
  2. Überprüfe die Schreibweise – Manchmal ist es nur ein Tippfehler.
  3. Stelle sicher, dass die Variable vor der Verwendung definiert wurde – Lies den Code von oben nach unten durch.
  4. Nutze print(dir()), um alle definierten Namen im aktuellen Scope anzuzeigen.

5. IndexError

Ein IndexError tritt auf, wenn du versuchst, auf ein Element einer Liste, eines Tupels oder einer Zeichenkette zuzugreifen, das nicht existiert. Stelle also immer sicher, dass der Index im gültigen Bereich liegt:

# Index nicht vorhanden:
liste = [1, 2, 3]
print(liste[5])

# Fehlermeldung:
IndexError: list index out of range

# Mögliche Korrektur:
liste = [1, 2, 3]
if len(liste) > 5:
    print(liste[5])
else:
    print("Index nicht vorhanden!")

5.1. Häufige Ursachen für den IndexError

Python-Listen haben nullbasierte Indizes. Das bedeutet, dass der erste Wert bei 0 beginnt, nicht bei 1. Daher überprüfe, ob du korrekt gezählt hast oder wähle z.B. das letzte Element. 

# Knapp vorbei:
zahlen = [10, 20, 30]
print(zahlen[3])

# Fehlermeldung:
IndexError: list index out of range

# Mögliche Korrektur:
zahlen = [10, 20, 30]
print(zahlen[len(zahlen)-1])

Wenn eine Liste leer ist, kannst du auf keine Elemente zugreifen. Prüfe daher, ob die Liste nicht leer ist. 

# Leere Liste:
leere_liste = []
print(leere_liste[0])

# Fehlermeldung:
IndexError: list index out of range

# Mögliche Korrektur:
leere_liste = []
if leere_liste:
    print(leere_liste[0])
else:
    print("Liste ist leer!")

Wenn du mit mehrdimensionalen Listen arbeitest, kann ein falscher Index leicht zu Fehlern führen. Prüfe daher alle Indizes oder arbeite mit len(), um die maximale Länge der Listen abzufragen:

# Erster Index zu groß:
matrix = [[1, 2, 3], [4, 5, 6]]
print(matrix[2][1])

# Fehlermeldung:
IndexError: list index out of range

# Mögliche Korrektur:
matrix = [[1, 2, 3], [4, 5, 6]]
if len(matrix) > 2 and len(matrix[2]) > 1:
    print(matrix[2][1])
else:
    print("Index außerhalb des gültigen Bereichs")

5.2. Debugging des IndexError

Wenn du einen IndexError bekommst, folge diesen Schritten:

  1. Fehlermeldung genau lesen – Sie zeigt dir, an welcher Stelle der Fehler auftritt.
  2. Länge der Liste prüfen – Nutze len(liste), um die maximale Indexgrenze zu ermitteln.
  3. Negative Indizes verstehen – Erinnere dich, dass -1 das letzte Element ist.
  4. Fehlersuche mit print() – Gib Werte aus, bevor du darauf zugreifst.
  5. Schleifen richtig schreiben – Achte darauf, dass Schleifenindizes nicht zu groß werden.

6. FileNotFoundError

Ein FileNotFoundError tritt auf, wenn du mit open() oder ähnlichen Methoden eine Datei öffnen möchtest, die nicht gefunden wird. Vielleicht hast du die Datei noch nicht erstellt oder sie wurde versehentlich gelöscht. Stelle daher sicher, dass die Datei existiert:

# Beispiel:
with open("datei.txt", "r") as file:
    content = file.read()
    
# Fehlermeldung:
FileNotFoundError: [Errno 2] No such file or directory: 'datei.txt'

# Mögliche Korrektur:
import os

if os.path.exists("datei.txt"):
    with open("datei.txt", "r") as file:
        content = file.read()
else:
    print("Die Datei existiert nicht!")

6.1. Häufige Ursachen für FileNotFoundError

Der FileNotFoundError kann auftreten, wenn du den falschen Pfad zur Datei angibst. Stelle daher sicher, dass der Pfad korrekt ist:

# Falscher Dateipfad:
with open("C:/Benutzer/Test/datei.txt", "r") as file:
    content = file.read()

# Fehlermeldung:
FileNotFoundError: [Errno 2] No such file or directory: 'C:/Benutzer/Test/datei.txt'

# Mögliche Korrektur:
import os
pfad = "C:/Benutzer/Test/datei.txt"
if os.path.exists(pfad):
    with open(pfad, "r") as file:
        content = file.read()
else:
    print("Falscher Dateipfad!")

Wenn du den relativen Pfad zur Datei verwendest, musst du sicherstellen, dass dein Skript im richtigen Verzeichnis läuft. Überprüfe das Arbeitsverzeichnis und ändere es, falls nötig:

# Arbeitsverzeichnis überprüfen:
import os
print("Aktuelles Verzeichnis:", os.getcwd())

# Arbeitsverzeichnis wechseln:
os.chdir("C:/Benutzer/Test/")

Falls du nicht sicher bist, ob die Datei existiert, kannst du try-except verwenden.

try:
    with open("datei.txt", "r") as file:
        content = file.read()
except FileNotFoundError:
    print("Fehler: Datei nicht gefunden!")

Falls die Datei nicht existiert, kannst du sie auch automatisch erstellen:

try:
    with open("datei.txt", "r") as file:
        content = file.read()
except FileNotFoundError:
    print("Datei nicht gefunden. Erstelle eine neue Datei.")
    with open("datei.txt", "w") as file:
        file.write("Dies ist eine neue Datei.")

6.2. Debugging des FileNotFoundError

Wenn du diesen Fehler bekommst, gehe folgendermaßen vor:

  1. Überprüfe den Dateinamen – Ist er richtig geschrieben?
  2. Prüfe den Dateipfad – Existiert der angegebene Pfad?
  3. Nutze os.path.exists(), um sicherzustellen, dass die Datei vorhanden ist.
  4. Überprüfe das aktuelle Arbeitsverzeichnis mit os.getcwd().
  5. Nutze try-except, um den Fehler abzufangen und eine alternative Lösung zu implementieren.

 

7. PermissionError

Der PermissionError (Errno 13) bedeutet, dass Python auf eine Datei oder ein Verzeichnis zugreifen will, für das du keine Erlaubnis hast. 

Beispiel:

# Code:
with open("/root/geheime_datei.txt", "w") as file:
    file.write("Test")
    
# Fehlermeldung:
PermissionError: [Errno 13] Permission denied: '/root/geheime_datei.txt'

7.1. Häufige Ursachen für den PermissionError

Manchmal benötigt eine Datei Administratorrechte, um darauf zugreifen zu können.

Lösung: Starte das Skript mit sudo (Linux/macOS) oder als Administrator (Windows).

sudo python3 mein_script.py

Falls die Datei oder der Ordner schreibgeschützt ist, musst du vorher die Zugriffsrechte ändern.

Lösung: Prüfe und ändere die Berechtigungen und füge z.B. Schreibrechte hinzu:

chmod +w datei.txt

Oder nutze Python, um die Berechtigungen zu überprüfen:

import os
print(oct(os.stat("datei.txt").st_mode))

Wenn eine Datei von einem anderen Programm geöffnet ist, kann Python sie nicht überschreiben. Mir passiert das regelmäßig wenn ich mit Python Excel-Dateien lese oder schreibe. Oft habe ich die Datei dann noch geöffnet. Die Lösung ist naheliegend: Schließe das andere Programm oder nutze Python, um zu prüfen, ob die Datei geöffnet ist:

import psutil
for proc in psutil.process_iter():
    try:
        if "datei.txt" in proc.open_files():
            print(f"Datei wird von {proc.name()} benutzt")
    except Exception:
        pass

Generell kannst du diesen Fehler mit einen try-except Block abfangen. Achte darauf, dass du auch wirklich nur den PermissionError abfängst, damit dir mögliche andere Probleme nicht entgehen:

try:
    with open("geschützte_datei.txt", "w") as file:
        file.write("Test")
except PermissionError:
    print("Fehler: Keine Schreibrechte für diese Datei!")

7.2. Debugging des PermissionError

  1. Prüfe die Datei- und Verzeichnisrechte mit ls -l (Linux/macOS) oder dir (Windows).
  2. Starte das Skript als Administrator.
  3. Speichere Dateien in einem anderen Verzeichnis, falls der Zugriff verweigert wird.
  4. Schließe andere Programme, die die Datei nutzen könnten.
  5. Nutze try-except, um Fehler abzufangen.

 

8. ValueError

Ein ValueError tritt in Python auf, wenn du eine Funktion mit einem ungültigen Wert aufrufst. Der übergebene Wert hat dann zwar den richtigen Datentyp, ist aber inhaltlich ungültig. Das passiert oft bei Umwandlungen oder Berechnungen.

Beispiel:

zahl = int("Hallo")

# Fehlermeldung:
ValueError: invalid literal for int() with base 10: 'Hallo'

8.1. Häufige Ursachen für den ValueError

Häufig tritt der ValueError auf, wenn du einen nicht-numerischen String in eine Zahl umwandeln willst.

# Nicht-numerischer String:
zahl = int("abc")

# Fehlermeldung:
ValueError: invalid literal for int() with base 10: 'abc'

# Mögliche Korrektur:
text = "123"
if text.isdigit():
    zahl = int(text)
    print(zahl)
else:
    print("Kein gültiger Zahlenwert!")

Eventuell versuchst du falsche Parameter an Funktionen zu übergeben. Viele eingebaute Funktionen erwarten bestimmte Werte. Im folgenden Beispiel erwartet math.sqrt() z.B. eine komplexe Zahl:

 

# Keine komplexe Zahl:
import math
math.sqrt(-1)

# Fehlermeldung:
ValueError: math domain error

# Nutze cmath für komplexe Zahlen:
import cmath
print(cmath.sqrt(-1))

Mir zumindest passieren immer wieder Listen- und Tupel-Entpackungsfehler. Wenn du mehr oder weniger Variablen als Werte erwartest, gibt es einen ValueError. Manchmal passiert so etwas wenn eine Funktion ein Objekt wie eine Liste als Parameter erwartet, du aber versehentlich viele Einzelwerte übergibst. Letztlich musst du sicherstellen, dass die Anzahl der Variablen mit der Anzahl an übergebenen Werten übereinstimmt:

# Zu viele Werte:
a, b = [1, 2, 3]

# Fehlermeldung:
ValueError: too many values to unpack (expected 2)

# Mögliche Korrektur:
a, b, c = [1, 2, 3]
print(a, b, c)

Manche Funktionen akzeptieren nur bestimmte Wertebereiche. 

# Beispiel:
zahlen = [1, 2, 3]
zahlen.remove(5)

# Fehlermeldung:
ValueError: list.remove(x): x not in list

# Mögliche Korrektur:
zahlen = [1, 2, 3]
if 5 in zahlen:
    zahlen.remove(5)

8.2. ValueError vermeiden und debuggen

Falls du einen ValueError bekommst, folge diesen Schritten:

  1. Fehlermeldung lesen – Sie zeigt genau, wo der Fehler liegt.
  2. Eingaben prüfen – Ist der Wert überhaupt gültig?
  3. Bedingungen - Prüfe Werte mit if-Abfragen.
  4. Fehlertolerante Umwandlung nutzen – Nutze try-except, um Fehler abzufangen.

Beispiel für eine sichere Eingabe:

try:
    zahl = int(input("Gib eine Zahl ein: "))
except ValueError:
    print("Bitte nur Zahlen eingeben!")

9. TypeError

Ein TypeError ist einer der häufigsten Fehler in Python. Er tritt auf, wenn du versuchst, mit inkompatiblen Datentypen zu arbeiten. Wenn du z.B. versuchst Strings und Zahlen zu addieren, dann musst du die Zahl es explizit in einen String umwandeln:

# Beispiel:
print("Das Ergebnis ist: " + 5)

# Fehlermeldung:
TypeError: can only concatenate str (not "int") to str

# Korrektur:
print("Das Ergebnis ist: " + str(5))

9.1. Häufige Ursachen für den TypeError

Wenn du eine Funktion nicht korrekt aufrufst und die beiden Klammern () vergisst, dann kann ein TypeError entstehen:

def meine_funktion():
    return "Hallo"
    
# Funktion nicht aufgerufen:
text = meine_funktion
print(text + " Welt")

# Fehlermeldung:
TypeError: unsupported operand type(s) for +: 'function' and 'str'

# Korrektur:
text = meine_funktion()
print(text + " Welt")

Eventuell hast du versucht, einen Index auf eine Zahl oder ein anderes nicht-indexierbares Objekt anzuwenden. Bei mir deutet dieser Fehler meist auf irgendein Problem im Code davor hin. Da muss ich oft genauer hinsehen und überlegen wo etwas nicht so läuft wie ich es mir gedacht habe und das korrekte Objekt (z.B. Liste, Matrix, String, etc.) nicht erstellt wird. Im folgenden Beispiel musst du die Zahl einfach in einen String umwandeln und kannst dann auf die einzelnen Elemente zugreifen:

# Beispiel:
zahl = 1234
print(zahl[0])

# Fehlermeldung:
TypeError: 'int' object is not subscriptable

# Mögliche Korrektur:
zahl = "1234"
print(zahl[0])

Python-Funktionen erwarten oft bestimmte Typen. Wird ein falscher Typ übergeben, gibt es einen TypeError.

# Beispiel:
import math
math.sqrt("16")

# Fehlermeldung:
TypeError: must be real number, not str

# Korrektur:
math.sqrt(int("16"))

9.2. TypeError vermeiden und debuggen

Falls du einen TypeError bekommst, folge diesen Schritten:

  1. Fehlermeldung genau lesen – Sie zeigt dir, welche Datentypen inkompatibel sind.
  2. Typen überprüfen – Nutze type(variable), um zu sehen, welchen Datentyp eine Variable hat.
  3. Explizite Umwandlungen nutzen – Wandeln Zahlen in Strings oder Strings in Zahlen um, wenn nötig.
  4. Überprüfe den vorherigen Code - Manchmal hat vorher etwas nicht geklappt und die erwartete Liste wurde nicht erzeugt.
  5. Nutze isinstance() – Falls du in einer Funktion bestimmte Typen erwartest, prüfe sie vorher

Hier ein Beispiel für isinstance():

def addiere(a, b):
    if isinstance(a, (int, float)) and isinstance(b, (int, float)):
        return a + b
    else:
        raise TypeError("Beide Argumente müssen Zahlen sein!")
        
addiere(10, "2")

# Fehlermeldung:
TypeError: Beide Argumente müssen Zahlen sein!

10. UnboundLocalError

Ein UnboundLocalError tritt auf, wenn Python innerhalb einer Funktion auf eine Variable zugreifen möchte, die noch nicht zugewiesen wurde.

Beispiel:

def fehlerhafte_funktion():
    print(x)  # x nicht zugewiesen
    x = 10
    return x

fehlerhafte_funktion()

# Fehlermeldung:
UnboundLocalError: local variable 'x' referenced before assignment

10.1. Häufige Ursachen für UnboundLocalError

Der häufigste Grund für diesen Fehler ist, dass eine Variable innerhalb einer Funktion verwendet wird, bevor ihr ein Wert zugewiesen wurde. In diesem Fall muss du die Zuweisung vor die Nutzung verschieben:

# Nutzung vor Zuweisung:
def beispiel():
    print(name)
    name = "Codedastic"
    return name

beispiel()

# Fehlermeldung:
UnboundLocalError: local variable 'name' referenced before assignment

# Korrektur:
def beispiel():
    name = "Codedastic"
    print(name)
    return name

beispiel()

Wenn eine globale Variable innerhalb einer Funktion geändert wird, betrachtet Python sie als lokal, wenn kein global-Keyword verwendet wird. Du kannst das global Keyword verwenden, um klarzustellen, dass eine globale Variable gemeint ist:

# Beispiel ohne global:
zahl = 5

def inkrementieren():
    zahl += 1  # Python denkt, dass 'zahl' lokal ist
    print(zahl)

inkrementieren()

# Fehlermeldung:
UnboundLocalError: local variable 'zahl' referenced before assignment

# Mögliche Korrektur:
zahl = 5

def inkrementieren():
    global zahl
    zahl += 1
    print(zahl)

inkrementieren()

Ein UnboundLocalError kann auftreten, wenn eine innere Funktion versucht, eine Variable aus der äußeren Funktion zu ändern, ohne sie explizit als nonlocal zu deklarieren. In diesem Fall hilft dir das nonlocal-Keyword:

# Beispiel

def aeussere_funktion():
    x = 10
    def innere_funktion():
        x += 1  # Python betrachtet x als lokale Variable
    innere_funktion()
    return x

aeussere_funktion()

# Fehlermeldung:
UnboundLocalError: local variable 'x' referenced before assignment

# Mögliche Korrektur:
def aeussere_funktion():
    x = 10
    def innere_funktion():
        nonlocal x
        x += 1
    innere_funktion()
    return x

print(aeussere_funktion())

10.2. Wie du den UnboundLocalError vermeidest

Falls du auf diesen Fehler stößt, folge diesen Schritten:

  1. Überprüfe, ob du die Variable vor der Nutzung zuweist.
  2. Falls du eine globale Variable innerhalb einer Funktion ändern willst, nutze global.
  3. Falls du eine Variable in einer inneren Funktion ändern möchtest, verwende nonlocal.
  4. Nutze global und nonlocal mit Bedacht. Normalerweise ist es sehr sinnvoll den scope von Variablen zu beschränken. Kannst du deinen Code umschreiben?
  5. Teste deinen Code mit print() oder type(), um herauszufinden, welche Variablen verfügbar sind.

 

11. UnicodeError

Ein UnicodeError tritt auf, wenn Python einen String nicht korrekt dekodieren oder kodieren kann. Oft passiert das bei der Verarbeitung von Dateien oder der Umwandlung zwischen verschiedenen Zeichensätzen.

11.1. Häufige Ursachen für den UnicodeError

Python verwendet standardmäßig UTF-8 für Strings, aber manche Dateien oder Systeme nutzen andere Kodierungen wie ASCII oder ISO-8859-1. In diesem Fall musst du die korrekte Kodierung wählen:

# Beispiel:
with open("textdatei.txt", "r") as file:
    content = file.read()
    
# Fehlermeldung:
# UnicodeEncodeError: 'ascii' codec can't encode character '\xfc' in position 2: ordinal not in range(128)

# Korrektur:
with open("textdatei.txt", "r", encoding="utf-8") as file:
    content = file.read()

Standard-ASCII kann nur Zeichen von 0-127 speichern. Sonderzeichen wie ä, ö, ü oder é führen zu Fehlern. Das kann schnell zu Problemen führen. Verwende in diesem Fall UTF-8 oder ignoriere nicht konvertierbare Zeichen:

# Beispiel:
text = "Hällo"
encoded_text = text.encode("ascii")

# Fehlermeldung:
# UnicodeEncodeError: 'ascii' codec can't encode character '\xe4' in position 1

# Lösung:
encoded_text = text.encode("utf-8")
encoded_text_ignore = text.encode("ascii", errors="ignore")

Möglicherweise hast du Probleme mit der Dekodierung eines Bytestrings. Nutze die richtige Kodierung. In der Regel ist dies UTF-8:

# Beispiel:
byte_text = b"GrÃGr\xc3¼Gr\xc3\xbcÃGr\xc3\xbc\xc3ŸGr\xc3\xbc\xc3\x9fe"
decoded_text = byte_text.decode("ascii")

# Fehlermeldung:
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 2 

# Lösung:
decoded_text = byte_text.decode("utf-8")

11.2. So vermeidest du den UnicodeError

Verwende UTF-8, wenn du Dateien liest oder schreibst:

with open("textdatei.txt", "r", encoding="utf-8") as file:
    content = file.read()

Prüfe die Kodierung deiner Datei, bevor du sie öffnest:

import chardet
with open("textdatei.txt", "rb") as file:
    result = chardet.detect(file.read())
    print(result["encoding"])

Nutze errors="ignore" oder errors="replace", um fehlerhafte Zeichen zu umgehen:

text = b"GrÃGr\xc3¼Gr\xc3\xbcÃGr\xc3\xbc\xc3ŸGr\xc3\xbc\xc3\x9fe".decode("utf-8", errors="replace")

12. MemoryError

Ein MemoryError tritt auf, wenn Python versucht, mehr Speicher zu verwenden, als verfügbar ist. Das kann passieren, wenn du riesige Datenmengen verarbeitest oder ineffizienten Code schreibst.

 

12.1. Häufige Ursachen für den MemoryError

Manchmal arbeitest du mit zu großen Datenmengen. Wenn du versuchst, eine zu große Liste, ein riesiges Array oder eine sehr große Datei im Speicher zu halten, kann ein MemoryError auftreten. Statt Listen zu verwenden, kannst du Generatoren nutzen:

# Beispiel mit Liste:
daten = [i for i in range(10**9)]

# Effizienter mit Generator:
daten = (i for i in range(10**9))

Python speichert Daten im Arbeitsspeicher. Wenn dein Programm viele ungenutzte Objekte hält, kann das zu einem MemoryError führen. Du kannst in diesem Fall die ungenutzten Objekte mit dem Garbage Collector manuell löschen. Normalerweise läuft der Garbage Collector im Hintergrund und wird von Python verwaltet. Du solltest den Garbage Collector nur manuell nutzen wenn es wirklich nötig ist, da du sonst eventuell Bugs in den Code einführst oder die CPU unnötig beanspruchst. So verwendest du den Garbage Collector:

import gc

daten = [1] * (10**8)
del daten  # Löscht die Liste

gc.collect()  # Startet den Garbage Collector

Wenn du sehr große Dateien komplett in den Speicher lädst, kann dies zu Problemen führen. Du solltest die Datei schrittweise einlesen:

# Datei komplett geladen:
with open("riesige_datei.txt", "r") as file:
    content = file.read()
    
# Schrittweises Laden:
with open("riesige_datei.txt", "r") as file:
    for line in file:
        print(line.strip())

Ineffiziente Nutzung von Listen kann ein weiteres Problem sein. Listen in Python können viel Speicher belegen, besonders wenn du sie wiederholt mit append() vergrößerst. Nutze stattdessen array für numerische Daten oder steige auf numpy um:

# Jedes Mal neue Speicherzuweisung:
daten = []
for i in range(10**6):
    daten.append(i)
    
# Mit array wird die Speichernutzung effizienter:
from array import array
daten = array("i", range(10**6))

Du kannst psutil nutzen, um den Speicherverbrauch zu messen und im Auge zu behalten. Oft is dies ein guter Ansatz, um zu erkennen wo der Fehler liegt und wo du genau zu viel Speicher verbrauchst:

import psutil
print(psutil.virtual_memory())

12.2. So debuggst du den MemoryError

Falls du auf einen MemoryError stößt, folge diesen Schritten:

  1. Speichernutzung überprüfen – Nutze psutil, um den Speicherverbrauch zu messen
  2. Generatoren verwenden – Falls du eine große Datenmenge verarbeitest, nutze Generatoren statt Listen.
  3. Unnötige Objekte löschen – Rufe gc.collect() auf, um den Speicher freizugeben.
  4. Dateien in kleinen Blöcken lesen – Lade große Dateien nicht vollständig in den Speicher.
  5. Alternative Datentypen nutzen – Falls du viele Zahlen speicherst, verwende array.array oder numpy statt regulärer Listen.

 

13. ImportError und ModuleNotFoundError

Beide Fehler gehen in die gleiche Richtung. Ein ModuleNotFoundError ist einer der häufigsten Fehler in Python. Er tritt auf, wenn du ein Modul importieren möchtest, das nicht gefunden oder nicht richtig installiert ist. Manchmal kann der Python Interpreter das Modul einfach nicht finden, da die Pfadangabe nicht korrekt ist. Der ImportError ist ein eher genereller Fehler. Manchmal wird das Modul innerhalb des Paketes nicht gefunden oder du hast den Namen des Moduls falsch geschrieben. 

Es gibt verschiedene Ursachen für die Fehler, aber die häufigsten sind:

  • Das Modul ist nicht installiert.
  • Das Modul ist am falschen Ort.
  • Es gibt Namenskonflikte.
  • Das Modul ist nicht kompatibel mit deiner Python-Version.
  • Es sind nicht alle abhängigen Module installiert.

13.1. Häufige Ursachen für den ImportError und ModuleNotFoundError

Die häufigste und naheliegendste Ursache ist, dass das Modul nicht installiert ist. In diesem Fall muss du einfach das Modul installieren. 

# Beispiel:
import numpy

# Fehlermeldung:
ModuleNotFoundError: No module named 'numpy'

Lösung: Installiere das Modul z.B. mit pip:

pip install numpy

Falls du mehrere Python-Versionen installiert hast, überprüfe, ob du das Modul für die richtige Version installierst:

python3 -m pip install numpy

Falls du in einer virtuellen Umgebung arbeitest, dann musst du z.B. pipenv verwenden:

pipenv install numpy

Falls du einen Packetmanager wie conda verwendest:

conda install anaconda::numpy

Eventuell ist das Modul nicht im richtigen Verzeichnis: Python sucht nach Modulen in bestimmten Verzeichnissen. Falls das Modul nicht im Suchpfad liegt, gibt es einen ImportError. In diesem Fall kannst du mit sys.path überprüfen, wo Python nach Modulen sucht und das Modul eventuell zum Pfad hinzufügen:

# Beispiel:
import mein_modul

# Fehlermeldung:
ModuleNotFoundError: No module named 'mein_modul'

# Überprüfe wo Python nach Modulen sucht:
import sys
print(sys.path)

# Füge den Pfad zum Modul hinzu:
import sys
sys.path.append("/pfad/zu/deinem/modul")

Ist der Modulname falsch geschrieben? Möglicherwiese hast du den Modulnamen falsch im Kopf oder du hast dich vertippt. Überprüfe den Modulnamen und vergewissere dich, dass der Modulname nicht falsch geschrieben ist. 

Gibt es Konflikte mit vorhandenen Dateien? Falls du eine Datei mit demselben Namen wie ein Modul erstellt hast, kann das zu einem ImportError führen. 

Beispiel:

mein_script/
 pandas.py  # Datei mit demselben Namen wie das Modul
 main.py

# Fehlermeldung:

ImportError: cannot import name 'pandas'

Lösung: Benenne deine Datei um, damit es keinen Namenskonflikt gibt.

Vielleicht ist das Modul nicht kompatibel mit der Python-Version? Falls du ein Modul installierst, das nicht mit deiner Python-Version kompatibel ist, kann das einen ImportError verursachen.

Lösung: Überprüfe deine Python-Version:

python --version

Falls das Modul eine andere Version benötigt, installiere es mit der richtigen Python-Version:

python3.9 -m pip install modulname

13.2. So verhinderst du den ImportError und ModuleNotFoundError

Falls du auf einen ImportError stößt, folge diesen Schritten:

  1. Fehlermeldung genau lesen – Sie gibt oft Hinweise auf das Problem.
  2. Überprüfe, ob das Modul installiert ist – Nutze pip list | grep modulname
  3. Python-Pfad überprüfen – Nutze sys.path, um zu sehen, wo Python nach Modulen sucht.
  4. Python-Version checken – Stelle sicher, dass du das Modul für die richtige Version installierst.
  5. Module mit importlib überprüfen – Falls du nicht sicher bist, ob das Modul verfügbar ist:

     

import importlib
print(importlib.util.find_spec("numpy"))

14. KeyError

Ein KeyError tritt in Python auf, wenn du versuchst, auf einen Schlüssel (Key) in einem Dictionary zuzugreifen, der nicht existiert.

14.1. Häufige Ursachen für den KeyError

Der häufigste Grund für diesen Fehler ist, dass der gesuchte Schlüssel nicht existiert. In diesem Fall kannst du .get() verwenden, um einen Standardwert zurückzugeben. Alternativ kannst du ein if-statement verwenden:

# Beispiel:
daten = {"name": "Anna", "alter": 25}
print(daten["adresse"])

# Fehlermeldung:
KeyError: 'adresse'

# Korrektur mit get:
print(daten.get("adresse", "Adresse nicht vorhanden"))

# Korrektkur mit if:
if "adresse" in daten:
    print(daten["adresse"])
else:
    print("Schlüssel nicht gefunden")

 

Hast du den Schlüssel korrekt geschrieben? Python unterscheidet übrigens auch zwischen Groß- und Kleinschreibung. Stelle daher sicher, dass du den Schlüssel korrekt geschrieben hast:

# Falsche Schreibweise:
daten = {"Name": "Anna"}
print(daten["name"])

# Fehlermeldung:
KeyError: 'name'

# Korrekte Schreibweise:
print(daten["Name"])

14.2. So gehst du vor, um den KeyError zu debuggen

Falls du auf einen KeyError stößt, folge diesen Schritten:

  1. Fehlermeldung genau lesen – Sie zeigt dir, welcher Schlüssel fehlt.
  2. Nutze if in, um zu prüfen, ob der Schlüssel existiert
  3. Nutze .get(), um einen Standardwert zurückzugeben
  4. Vermeide Tippfehler – Prüfe die Schreibweise der Schlüssel.
  5. Nutze defaultdict, falls du immer einen Standardwert brauchst:

from collections import defaultdict
daten = defaultdict(lambda: "Nicht vorhanden", {"name": "Anna"})
print(daten["stadt"])  # Gibt 'Nicht vorhanden' zurück

15. StopIterationError

Ein StopIteration tritt auf, wenn ein Iterator erschöpft ist, aber next() trotzdem aufgerufen wird.

Beispiel:

zahlen = iter([1, 2, 3])
print(next(zahlen))  # 1
print(next(zahlen))  # 2
print(next(zahlen))  # 3
print(next(zahlen))  # Fehler!

# Fehlermeldung:
StopIteration

15.1. Häufige Ursachen für StopIteration Error

Ein häufiger Grund für diesen Fehler ist das wiederholte Aufrufen von next() ohne zu überprüfen, ob der Iterator noch Elemente hat. In diesem Fall kannst du try-except verwenden, um den Fehler abzufangen:

# Beispiel:
zahlen = iter([1, 2, 3])
while True:
    print(next(zahlen))
    
# Fehlermeldung:
StopIteration

# Mögliche Korrektur:
zahlen = iter([1, 2, 3])
while True:
    try:
        print(next(zahlen))
    except StopIteration:
        print("Keine weiteren Elemente.")
        break

Generatoren in Python hören auf, wenn keine Werte mehr erzeugt werden. Verwende eine for-Schleife, um den Generator korrekt zu durchlaufen:

# Ohne for-Schleife:

def mein_generator():
    yield 1
    yield 2
    yield 3

g = mein_generator()
print(next(g))
print(next(g))
print(next(g))
print(next(g))  # Fehler!

# Fehlermeldung:
StopIteration

# Korrektur mit for-Schleife:
def mein_generator():
    yield 1
    yield 2
    yield 3

for wert in mein_generator():
    print(wert)

Wenn du eigene Iteratoren erstellst, musst du StopIteration korrekt behandeln:

class MeinIterator:
    def __init__(self, zahlen):
        self.zahlen = zahlen
        self.index = 0
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.index >= len(self.zahlen):
            raise StopIteration("Iterator erschöpft")
        wert = self.zahlen[self.index]
        self.index += 1
        return wert

it = MeinIterator([1, 2, 3])
for i in it:
    print(i)

15.2. So vermeidest du den StopIteration Fehler

Falls du auf einen StopIteration-Fehler stößt, folge diesen Schritten:

  1. Verwende for-Schleifen statt next(), wenn möglich.
  2. Nutze try-except, um den Fehler abzufangen.
  3. Überprüfe, ob ein Iterator noch Elemente hat, bevor du next() aufrufst.
  4. Verstehe, wann Generatoren und Iteratoren enden.

 

16. OverflowError

Python kann sehr große Zahlen speichern, aber in manchen Fällen stößt es an Grenzen. Ein OverflowError passiert, wenn eine Berechnung ein Ergebnis liefert, das zu groß für den verwendeten Datentyp ist.

Beispiel:

import math
math.exp(1000)  # Versucht, e^1000 zu berechnen

# Fehlermeldung:
OverflowError: math range error

16.1. Häufige Ursachen für den OverflowError

Mathematische Funktionen wie math.exp() oder pow() können zu riesigen Zahlen führen. Begrenze in diesem Fall den Exponenten oder verwende decimal für große Zahlen:

# Beispiel:
import math
math.exp(1000)

# Fehlermeldung:
OverflowError: math range error

# Mögliche Korrektur:
import decimal
print(decimal.Decimal(math.exp(500)))

16.2. So vermeidest du den OverflowError

Falls du auf einen OverflowError stößt, folge diesen Schritten:

  1. Überprüfe, welche Berechnung den Fehler auslöst.
  2. Nutze decimal für große Zahlen, um die Präzision zu erhöhen.

     

17. RecursionError

Rekursion kann in Python eine elegante Möglichkeit sein, Probleme zu lösen. Doch wenn du nicht aufpasst, landest du schnell im RecursionError. Ein RecursionError tritt auf, wenn eine Funktion sich zu oft selbst aufruft und dabei das sogenannte Rekursionslimitüberschreitet. Python schützt sich damit vor einem Stack Overflow, also einer Überlastung des Speicherbereichs für Funktionsaufrufe.

Beispiel:

# Verursacht Fehler:
def endlos():
    return endlos()

endlos()

# Fehlermeldung:
RecursionError: maximum recursion depth exceeded

# Korrektur mit Abbruchbedingung:
def rekursion(n):
    if n == 0:
        return 1
    return rekursion(n - 1)
rekursion(10)

17.1. Wie viele Rekursionen sind erlaubt?

Python hat eine eingebaute Begrenzung für die maximale Rekursionstiefe. Standardmäßig liegt das Limit bei etwa 1000 oder 3000 Rekursionen (abhängig von der Python-Version und dem Betriebssystem). Das Limit kannst du mit sys.getrecursionlimit() herausfinden:

import sys
print(sys.getrecursionlimit())

Du kannst das Limit mit sys.setrecursionlimit(n) erhöhen. Du solltest das Limit aber nur mit Bedacht erhöhen. Am besten lässt du ganz die Finger davon. Denn:

  • Ein zu hohes Limit kann zu einem Stack Overflow führen.
  • Dein Programm könnte abstürzen, statt kontrolliert zu stoppen.
  • Eine schlechte rekursive Implementierung wird dadurch nicht besser.

Besser ist es, eine iterative Lösung als Alternative zur Rekursion zu verwenden. Oder du schaust dir deinen Code nochmal genauer an und versuchst den Code zu überarbeiten. Vielleicht hast du etwas übersehen und kannst deine Implementierung verbessern!

17.2. Alternativen zur Rekursion

Manchmal ist es sinnvoller, eine iterative Lösung statt einer rekursiven zu wählen. Diese Version verwendet eine while-Schleife, um das gleiche Ergebnis zu erreichen – ohne das Risiko eines RecursionError:

def countdown_iterativ(n):
    while n > 0:
        print(n)
        n -= 1
    print("Fertig!")

countdown_iterativ(5)

17.3. So optimierst du rekursive Funktionen

Falls du rekursive Funktionen nicht vermeiden kannst, hilft der LRU-Cache, um doppelte Berechnungen zu vermeiden. Dazu importierst du lru_cache aus functools und verwendest lru_cache als Decorator. Im folgenden Beispiel wäre die Berechnung ohne lru_cache sehr langsam. Mit Cache speichert Python vorherige Werte und vermeidet unnötige Berechnungen:

from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(50))

17.4. Häufige Fehler bei der Rekursion

Hier sind typische Fehler, die zu einem RecursionError führen:

  1. Fehlende Abbruchbedingung → Funktion ruft sich endlos auf.
  2. Zu große Eingabewerte → Rekursionstiefe wird überschritten.
  3. Ineffiziente rekursive Berechnungen → Funktionen wie Fibonacci können stark optimiert werden.
  4. Rekursionslimit künstlich erhöhen → Führt eher zu Problemen als zur Lösung.
  5. Rekursive Funktionen verwendet, obwohl einen iterative Lösung besser wäre.

 

18. KeyboardInterrupt

Ein KeyboardInterrupt ist eine spezielle Ausnahme (Exception), die in Python auftritt, wenn du ein laufendes Programm manuell unterbrichst. Das passiert meistens, wenn du Strg + C (Ctrl + C) auf deiner Tastatur drückst.

Wenn du Strg + C drückst, passiert Folgendes:

  1. Das Betriebssystem sendet das Signal SIGINT (Interrupt Signal) an das Python-Programm.
  2. Python erzeugt daraufhin eine KeyboardInterrupt-Exception.
  3. Falls du diese Ausnahme nicht behandelst, wird das Programm gestoppt und gibt eine Fehlermeldung aus.

Das bedeutet: Python stoppt nicht sofort, sondern erst beim nächsten ausführbaren Codeblock. Wenn dein Skript gerade eine Aufgabe verarbeitet, kann es sein, dass es einen Moment dauert, bis die Unterbrechung erfolgt.

Hier ein Beispiel, das unendlich läuft – bis du Strg + C drückst:

 

while True:
    print("Das Programm läuft... (Drücke Strg + C zum Stoppen)")

18.1. KeyboardInterrupt mit try-except abfangen

Manchmal möchtest du das Programm nicht einfach „hart abbrechen“, sondern eine saubere Beendigung sicherstellen. Dazu kannst du try-except verwenden:

try:
    while True:
        print("Läuft... Drücke Strg + C zum Beenden.")
except KeyboardInterrupt:
    print("\nProgramm wurde durch den Benutzer gestoppt.")

Wenn du jetzt Strg + C drückst, erhältst du keine Fehlermeldung, sondern eine kontrollierte Ausgabe:

Läuft... Drücke Strg + C zum Beenden.
Läuft... Drücke Strg + C zum Beenden.
^C
Programm wurde durch den Benutzer gestoppt.

Das ist nützlich, wenn du z. B. vor dem Beenden noch eine Datei speichern oder eine Datenbankverbindung schließen möchtest.

18.2. Wie kann man ein Skript sicher beenden?

Falls du KeyboardInterrupt manuell abfangen möchtest, kannst du das Programm mit sys.exit() sauber beenden. Das hat folgende Vorteile:

  • Es beendet das Skript sofort.
  • Es signalisiert, dass die Beendigung gewollt war.
  • Andere Teile des Codes werden nicht mehr ausgeführt.

Beispiel:

import sys

try:
    while True:
        print("Läuft...")
except KeyboardInterrupt:
    print("\nBeenden...")
    sys.exit()

Auf Unix-basierten Systemen (Linux, macOS) kannst du signal verwenden, um SIGINT oder andere Signale abzufangen. Hier wird anstelle von KeyboardInterrupt direkt auf SIGINT reagiert. Das kann nützlich sein, wenn du andere Signale wie SIGTERM abfangen möchtest.

Beispiel:

import signal
import sys

def signal_handler(sig, frame):
    print("\nSignal empfangen, Programm wird beendet...")
    sys.exit()

signal.signal(signal.SIGINT, signal_handler)

while True:
    print("Läuft...")

19. RuntimeError

Ein RuntimeError tritt auf, wenn während der Laufzeit eines Programms ein Problem auftritt, das Python nicht eindeutig einer bestimmten Fehlerkategorie (z. B. ValueError, TypeError) zuordnen kann. Er gehört zur Gruppe der "allgemeinen" Fehler und wird oft als Platzhalter für unerwartete Probleme verwendet.

Wichtig: Ein RuntimeError tritt nicht auf, wenn dein Code schon beim Starten fehlschlägt. Er passiert erst während der Ausführung, also wenn das Programm bereits läuft.

19.1. Typische Ursachen für einen RuntimeError

Wenn eine Funktion sich selbst ruft, aber nie aufhört, kann ein RecursionError auftreten, der eine Unterklasse von RuntimeError ist. Sieh dir den Abschnitt zum RecursionError dazu genauer an. Ein RuntimeError kann auftreten, wenn du versuchst, Threads auf eine unsichere Weise zu manipulieren. Im folgenden Beispiel verursacht threading.current_thread().join() einen RuntimeError, weil sich ein Thread nicht selbst beenden kann:

# Beispiel:
import threading

def worker():
    print("Thread läuft")
    threading.current_thread().join()  # Deadlock!

thread = threading.Thread(target=worker)
thread.start()

# Fehlermeldung:
RuntimeError: cannot join current thread

Stelle sicher, dass du einen Thread sicher stoppst, z. B. mit thread.join():

def worker():
    print("Thread läuft")

thread = threading.Thread(target=worker)
thread.start()
thread.join()  # Warten, bis der Thread beendet ist

Manchmal kann ein RuntimeError auftreten, wenn du eine Schleife über eine veränderte Datenstruktur laufen lässt.

Beispiel:

my_list = [1, 2, 3]
for item in my_list:
    my_list.append(item * 2) # Liste während Iteration verändert
    
# Fehlermeldung:
RuntimeError: dictionary changed size during iteration

19.2. Wie kannst du den RuntimeError vermeiden?

  1. Nutze rekursive Funktionen mit Abbruchbedingung
  2. Verändere Listen oder Dictionaries nicht während der Iteration
  3. Achte auf sich selbst blockierende Threads Verwende thread.join(), um sicherzustellen, dass Threads beendet werden

     

20. ZeroDivisionError

Der ZeroDivisionError tritt auf, wenn du versuchst, eine Zahl durch 0 zu teilen. Python stoppt dann dein Programm und gibt eine Fehlermeldung aus. Das passiert, weil eine Division durch null mathematisch nicht definiert ist.

Beispiel: 

print(10 / 0)

# Fehlermeldung:
ZeroDivisionError: division by zero

20.1. Ursachen für einen ZeroDivisionError

Letztlich tritt der ZeroDivsionError immer auf, wenn du eine Zahl durch Null teilen willst. Das kann in folgenden Fällen vorkommen:

# Normale Division:
print(10 / 0)   # Fehler

# Ganzahlige Division:
print(10 // 0)  # Fehler

# Modulo-Operation:
print(10 % 0)  # Fehler

# Berechnungen mit Variablen:
def divide(a, b):
    return a / b

print(divide(10, 0))  # Fehler

20.2. So vermeidest du den ZeroDivisionError

Du kannst try-except verwenden, um den Fehler abzufangen und dein Programm vor einem Absturz zu bewahren.

def divide(a, b):
    try:
        return a / b
    except ZeroDivisionError:
        return "Fehler: Division durch 0 nicht möglich"

print(divide(10, 0))  # Ausgabe: Fehler: Division durch 0 nicht möglich
print(divide(10, 2))  # Ausgabe: 5.0

Vor der Division prüfen:

def safe_divide(a, b):
    if b == 0:
        return "Fehler: Division durch 0"
    return a / b

print(safe_divide(10, 0))  # Ausgabe: Fehler: Division durch 0

Du kannst einen Standardwert verwenden. Falls eine Division durch null passiert, kannst du eine Alternative zurückgeben:

def safe_divide(a, b):
    return a / b if b != 0 else 0  # Rückgabe eines Standardwerts

print(safe_divide(10, 0))  # Ausgabe: 0

Wenn du eine Liste von Zahlen durch eine andere Zahl teilen willst, solltest du Nullwerte vorher filtern:

zahlen = [10, 5, 0, 2]

ergebnisse = [x / y if y != 0 else "Fehler" for x, y in zip(zahlen, [2, 0, 5, 0])]
print(ergebnisse)  # Ausgabe: [5.0, 'Fehler', 0.0, 'Fehler']

Der ZeroDivisionError tritt auf, wenn du durch null teilst. So kannst du den Fehler vermeiden:

  1. Verwende try-except, um den Fehler abzufangen.
  2. Prüfe vorher, ob der Divisor null ist.
  3. Nutze Standardwerte.
  4. Vermeide Null-Divisionen in Schleifen mit einer Filterung.

 

Teilen: