Python benutzerdefinierte Exceptions: Ein praktischer Leitfaden
Python benutzerdefinierte Exceptions
In diesem Tutorial lernen Sie, wie Sie benutzerdefinierte Exceptions definieren, die auf Ihre Bedürfnisse zugeschnitten sind, illustriert mit praktischen Beispielen.
Python bietet viele eingebaute Exceptions, die Fehler signalisieren, wenn ein Programm auf unerwartete Bedingungen stößt. Es gibt jedoch Zeiten, in denen die eingebauten nicht präzise das Problem beschreiben, auf das Sie stoßen. In diesen Fällen können Sie Ihre eigenen benutzerdefinierten Exception-Typen erstellen, um Ihren Code klarer und wartbarer zu machen.
Benutzerdefinierte Exceptions erstellen
Die Definition einer benutzerdefinierten Exception in Python ist unkompliziert: Erstellen Sie eine neue Klasse, die von der eingebauten Exception-Klasse (oder einer ihrer Unterklassen) erbt. Die meisten Standard-Exceptions leiten sich von Exception ab, sodass Ihre benutzerdefinierte Klasse nahtlos in Pythons Fehlerbehandlungssystem integriert wird.
> >>> class CustomError(Exception):
... pass
...
> >>> raise CustomError
Traceback (most recent call last):
...
__main__.CustomError
> >>> raise CustomError("Ein Fehler ist aufgetreten")
Traceback (most recent call last):
...
__main__.CustomError: Ein Fehler ist aufgetreten
Hier ist CustomError eine benutzerdefinierte Exception, die von Exception erbt. Sie kann mit raise und einer optionalen Nachricht ausgelöst werden. Bei großen Projekten ist es gängige Praxis, alle benutzerdefinierten Exceptions in einem dedizierten Modul (z. B. exceptions.py oder errors.py) zu platzieren, damit sie leicht zu finden und zu warten sind.
Beispiel: Benutzerdefinierte Exception in Python
Das folgende Programm demonstriert, wie benutzerdefinierte Exceptions verwendet werden können, um Benutzereingaben zu steuern. Es fordert den Benutzer wiederholt nach einer Zahl auf, bis er den gespeicherten Wert errät. Das Programm gibt einen Hinweis – ob der Tipp zu hoch oder zu niedrig ist – indem es eine maßgeschneiderte Exception auslöst.
# Python benutzerdefinierte Exceptions definieren
class Error(Exception):
"""Basisklasse für andere Exceptions"""
pass
class ValueTooSmallError(Error):
"""Wird ausgelöst, wenn der Eingabewert zu klein ist"""
pass
class ValueTooLargeError(Error):
"""Wird ausgelöst, wenn der Eingabewert zu groß ist"""
pass
# die Zielzahl
zahl = 10
# fragen, bis der Tipp korrekt ist
while True:
try:
i_num = int(input("Geben Sie eine Zahl ein: "))
if i_num < zahl:
raise ValueTooSmallError
elif i_num > zahl:
raise ValueTooLargeError
break
except ValueTooSmallError:
print("Dieser Wert ist zu klein, versuchen Sie es erneut!")
print()
except ValueTooLargeError:
print("Dieser Wert ist zu groß, versuchen Sie es erneut!")
print()
print("Glückwunsch! Sie haben es richtig erraten.")
Beispielausführung:
Geben Sie eine Zahl ein: 12 Dieser Wert ist zu groß, versuchen Sie es erneut! Geben Sie eine Zahl ein: 0 Dieser Wert ist zu klein, versuchen Sie es erneut! Geben Sie eine Zahl ein: 8 Dieser Wert ist zu klein, versuchen Sie es erneut! Geben Sie eine Zahl ein: 10 Glückwunsch! Sie haben es richtig erraten.
In diesem Beispiel bietet die Basisklasse Error einen gemeinsamen Vorfahren für die beiden spezifischen Fehlertypen. Dieser Ansatz hält die Exception-Hierarchie klar und ermöglicht es Ihnen, alle verwandten Fehler mit einer einzelnen except Error-Klausel abzufangen, falls gewünscht.
Exception-Klassen anpassen
Benutzerdefinierte Exceptions können auch zusätzliche Daten speichern oder informativere Nachrichten präsentieren. Dies erfordert das Überschreiben von __init__ und optional __str__. Das folgende Beispiel veranschaulicht ein Gehaltsvalidierungsszenario.
class SalaryNotInRangeError(Exception):
"""Exception für Fehler bei der Eingabe des Gehalts.
Attributes:
salary -- Eingabegehalt, das den Fehler verursacht hat
message -- Erklärung des Fehlers
"""
def __init__(self, salary, message="Gehalt liegt nicht im Bereich (5000, 15000)"):
self.salary = salary
self.message = message
super().__init__(self.message)
salary = int(input("Geben Sie Gehaltsbetrag ein: "))
if not 5000 < salary < 15000:
raise SalaryNotInRangeError(salary)
Ausgabe
Geben Sie Gehaltsbetrag ein: 2000 Traceback (most recent call last): File "<string>", line 17, in <module> raise SalaryNotInRangeError(salary) __main__.SalaryNotInRangeError: Gehalt liegt nicht im Bereich (5000, 15000)
Durch das Überschreiben von __init__ kann die Exception den problematischen Wert mitführen. Wenn Sie eine benutzerdefinierte String-Darstellung wünschen, überschreiben Sie __str__ wie unten gezeigt:
class SalaryNotInRangeError(Exception):
"""Exception für Fehler bei der Eingabe des Gehalts.
Attributes:
salary -- Eingabegehalt, das den Fehler verursacht hat
message -- Erklärung des Fehlers
"""
def __init__(self, salary, message="Gehalt liegt nicht im Bereich (5000, 15000)"):
self.salary = salary
self.message = message
super().__init__(self.message)
def __str__(self):
return f'{self.salary} → {self.message}'
salary = int(input("Geben Sie Gehaltsbetrag ein: "))
if not 5000 < salary < 15000:
raise SalaryNotInRangeError(salary)
Ausgabe
Geben Sie Gehaltsbetrag ein: 2000 Traceback (most recent call last): File "/home/user/untitled.py", line 20, in <module> raise SalaryNotInRangeError(salary) __main__.SalaryNotInRangeError: 2000 → Gehalt liegt nicht im Bereich (5000, 15000)
Für einen tieferen Einstieg in Exception-Handling-Muster konsultieren Sie das Python Exception Handling Tutorial.
Um mehr über das Design robuster Anwendungen zu erfahren, erkunden Sie Python Objektorientierte Programmierung.
Python
- Python-Datentypen meistern: Praxisleitfaden
- Python-Operatoren meistern: Umfassender Leitfaden
- Python pass-Statement meistern: Praxisleitfaden
- Python-Funktionsargumente meistern: Positional, Keyword & Default-Parameter
- Python-Dictionaries meistern: Erstellung, Manipulation und fortgeschrittene Techniken
- Python-Fehler & eingebaute Exceptions meistern
- Python Objektorientierte Programmierung meistern: Klassen, Vererbung, Kapselung & Polymorphie
- Python Vererbung meistern: Konzepte, Syntax und praktische Beispiele
- Python Iteratoren meistern: Funktionsweise und Erstellung eigener Iteratoren
- type() und isinstance() in Python verstehen: Praktische Beispiele