Seite wählen

Python Ausnahmebehandlung

Python Ausnahmebehandlung
Python Ausnahmebehandlung

Python 3 definiert 63 integrierte Ausnahmen

Ausnahmehierarchie
Python Ausnahmehierarchie

Python Exception Hierarchy

  • BaseException
    • Exception
      • TypeError
      • StopAsyncIteration
      • StopIteration
      • ImportError
        • ModuleNotFoundError
        • ZipImportError
      • OSError
        • ConnectionError
          • BrokenPipeError
          • ConnectionAbortedError
          • ConnectionRefusedError
          • ConnectionResetError
        • BlockingIOError
        • ChildProcessError
        • FileExistsError
        • FileNotFoundError
        • IsADirectoryError
        • NotADirectoryError
        • InterruptedError
        • PermissionError
        • ProcessLookupError
        • TimeoutError
        • UnsupportedOperation
        • herror
        • gaierror
        • timeout
        • Error
          • SameFileError
        • SpecialFileError
        • ExecError
        • ReadError
      • EOFError
      • RuntimeError
        • RecursionError
        • NotImplementedError
        • _DeadlockError
        • BrokenBarrierError
      • NameError
        • UnboundLocalError
      • AttributeError
      • SyntaxError
        • IndentationError
          • TabError
      • LookupError
        • IndexError
        • KeyError
        • CodecRegistryError
      • ValueError
        • UnicodeError
          • UnicodeEncodeError
          • UnicodeDecodeError
          • UnicodeTranslateError
        • UnsupportedOperation
      • AssertionError
      • ArithmeticError
        • FloatingPointError
        • OverflowError
        • ZeroDivisionError
      • SystemError
        • CodecRegistryError
      • ReferenceError
      • BufferError
      • MemoryError
      • Warning
        • UserWarning
        • DeprecationWarning
        • PendingDeprecationWarning
        • SyntaxWarning
        • RuntimeWarning
        • FutureWarning
        • ImportWarning
        • UnicodeWarning
        • BytesWarning
        • ResourceWarning
    • GeneratorExit
    • SystemExit
    • KeyboardInterrupt

Sie können allgemeinere Ausnahmen verwenden, die auch die darunterliegenden Ausnahmen abdecken. Das bedeutet, dass beispielsweise, wenn Sie Exception anstelle von ZeroDivisionError verwenden und der Code im Try-Block mit 0 geteilt wird, die allgemeinere Ausnahme ausgelöst wird.

Python stoppt und „wirft“ bei der ersten Ausnahme, die in der Reihenfolge auftritt, in der sie definiert sind.

Die Reihenfolge der Ausnahmen ist wichtig.

Einzelfehlerbehandlung

import logging

logging.basicConfig(level=logging.INFO)

def process_item(data, idx):
"""
Example operations that can raise:
- KeyError when missing dict key
- IndexError when idx out of range
- ValueError when int conversion fails
"""
try:
# 1) get value from dict (may raise KeyError)
raw = data["value"]

# 2) convert to int (may raise ValueError)
    val = int(raw)

    # 3) access list element (may raise IndexError)
    result = val / data["divisors"][idx]  # may raise KeyError or IndexError or ZeroDivisionError

except KeyError as e:
    logging.warning("Missing required key: %s", e)
    # handle or provide a fallback
    return None

except IndexError as e:
    logging.warning("Index out of range: %s", e)
    return None

except ValueError as e:
    logging.warning("Invalid numeric value: %s", e)
    return None

except ZeroDivisionError as e:
    logging.warning("Division by zero: %s", e)
    return None

except Exception as e:
    # catch-all for unexpected exceptions — log and re-raise to avoid hiding bugs
    logging.exception("Unexpected error in process_item")
    raise

else:
    # executed if no exception occurred
    logging.info("Processed successfully: %s", result)
    return result

finally:
    # cleanup code that always runs (if needed)
    logging.debug("process_item finished")

mehrere Fehler zusammenpacken

import logging

logging.basicConfig(level=logging.INFO)

def process_item_grouped(data, idx):
try:
raw = data["value"]
val = int(raw)
result = val / data["divisors"][idx]

except (KeyError, IndexError) as e:
    # grouped handling for "lookup / missing" type errors
    logging.warning("Lookup error (missing key or bad index): %s", e)
    return None

except ValueError as e:
    logging.warning("Invalid numeric value: %s", e)
    return None

except ZeroDivisionError as e:
    logging.warning("Division by zero: %s", e)
    return None

except Exception as e:
    logging.exception("Unexpected error in process_item_grouped")
    raise

else:
    logging.info("Processed successfully: %s", result)
    return result

Kurze Best-Practice-Checkliste

  • Fangen Sie spezifische Ausnahmen ab, nicht Exception/BaseException (außer beim Loggen oder erneuten Auslösen).
  • Vermeiden Sie ein einfaches except: – es fängt KeyboardInterrupt und SystemExit ab.
  • Verwenden Sie except (A, B) als e:, um verwandte Ausnahmen zu gruppieren.
  • Protokollieren Sie Ausnahmen (logging.exception(), wenn Sie den Traceback wünschen).
  • Lösen Sie unerwartete Ausnahmen erneut aus, anstatt sie stillschweigend zu ignorieren.
  • Bevorzugen Sie Kontextmanager (mit open(…)) für die Ressourcenbereinigung; verwenden Sie finally für andere Bereinigungen.

Die 13 häufigsten Exceptions in Python mit kurzer Beschreibung

SyntaxError
Fehler beim Parsen/bei der Syntax — der Interpreter versteht den Code nicht.
Beispiel: if x == 1 print(x)SyntaxError
Tipp: fehlende Doppelpunkte, Klammern oder falsche Einrückung prüfen.

NameError
Zugriff auf eine nicht definierte Variable oder Funktion.
Beispiel: print(foo) wenn foo nie definiert wurde → NameError
Tipp: Variablennamen/Schreibweisen prüfen.

TypeError
Operation auf inkompatiblen Typen (z. B. Addition von Zahl und String).
Beispiel: 3 + "a"TypeError
Tipp: Typen explizit konvertieren oder Typchecks einbauen.

ValueError
Der Typ stimmt, aber der Wert ist ungültig (z. B. fehlerhafte Konvertierung).
Beispiel: int("abc")ValueError
Tipp: Eingaben validieren oder try/except verwenden.

IndexError
Zugriff auf einen Listen-/Tuple-Index außerhalb des gültigen Bereichs.
Beispiel: lst = [1]; lst[1]IndexError
Tipp: Längen prüfen (len()), negative Indizes beachten.

KeyError
Zugriff auf einen nicht vorhandenen Schlüssel in einem Dictionary.
Beispiel: d = {}; d['x']KeyError
Tipp: d.get('x') oder if 'x' in d: verwenden.

AttributeError
Zugriff auf ein Attribut oder eine Methode, die das Objekt nicht hat.
Beispiel: None.strip()AttributeError
Tipp: Objekt-Typ prüfen oder hasattr() nutzen.

ZeroDivisionError
Division oder Modulo durch Null.
Beispiel: 1 / 0ZeroDivisionError
Tipp: Divisor vorher auf 0 prüfen.

FileNotFoundError
Versuch, eine Datei zu öffnen, die nicht existiert.
Beispiel: open("nichtda.txt")FileNotFoundError
Tipp: Pfad prüfen oder try/except und klare Fehlermeldung.

ImportError / ModuleNotFoundError
Fehler beim Importieren eines Moduls; ModuleNotFoundError ist eine häufige Unterklasse.
Beispiel: import does_not_existModuleNotFoundError
Tipp: Paketnamen prüfen, Umgebung/venv kontrollieren, pip install falls nötig.

OSError
Allgemeine System-/I/O-Fehler (Dateisystem, Betriebssystem-Aufrufe). Viele Datei- und Netzwerkfehler sind Unterklassen davon.
Beispiel: Probleme beim Öffnen/Lesen/Schreiben von Dateien oder Netzwerk-I/O.
Tipp: genaue Unterklasse (FileNotFoundError, PermissionError) catchen, wenn möglich.

PermissionError
Keine Zugriffsrechte für eine Datei/Operation (Unterklasse von OSError).
Beispiel: open("/root/secret.txt", "r") ohne Rechte → PermissionError
Tipp: Dateiberechtigungen prüfen oder Berechtigungen anpassen.

RecursionError
Maximale Rekursionstiefe überschritten (zu tiefe rekursive Aufrufe).
Beispiel: unendliche Rekursion in einer Funktion → RecursionError
Tipp: Rekursive Algorithmen in Iterationen umwandeln oder Rekursionstiefe begrenzen.

Raise keyword

raise löst (wirft) eine Ausnahme aus — du signalisierst damit, dass etwas schiefgelaufen ist und die normale Programmausführung unterbrochen werden soll. Das kann eine eingebaute Exception sein oder eine von dir definierte.

eine eingebaute Exception werfen

def set_age(age):
if age < 0:
raise ValueError(„Alter darf nicht negativ sein“)
return age

print(set_age(25)) # 25
print(set_age(-3)) # ValueError: Alter darf nicht negativ sein

Eigene Exception definieren und werfen

class InvalidAgeError(Exception):
„““Eigene Ausnahme für ungültiges Alter“““
pass

def set_age(age):
if age < 0:
raise InvalidAgeError(f“Ungültiges Alter: {age}“)
return age

assert expression : AssertionError

Es gibt AssertionError zurück, wenn der Ausdruck als „None“ ausgewertet wird, andernfalls geschieht nichts.

error: Content is protected !!