Python Custom Exceptions
Table of Contents
In diesem Tutorial erfahren Sie anhand von Beispielen, wie Sie benutzerdefinierte Ausnahmen je nach Ihren Anforderungen definieren.
Python hat zahlreiche eingebaute Ausnahmen, die Ihr Programm dazu zwingen, einen Fehler auszugeben, wenn etwas im Programm schief läuft.
Manchmal müssen Sie jedoch Ihre eigenen benutzerdefinierten Ausnahmen erstellen, die Ihrem Zweck dienen.
Creating Custom Exceptions
In Python können Benutzer benutzerdefinierte Ausnahmen definieren, indem sie eine neue Klasse erstellen. Diese Ausnahmeklasse muss entweder direkt oder indirekt von der eingebauten Exception
Klasse. Die meisten der eingebauten Exceptions sind ebenfalls von dieser Klasse abgeleitet.
>>> class CustomError(Exception): ... pass ... >>> raise CustomError Traceback (most recent call last): ... __main__.CustomError >>> raise CustomError("An error occurred") Traceback (most recent call last): ... __main__.CustomError: An error occurred
Hier haben wir eine benutzerdefinierte Ausnahme namens CustomError
die erbt von der Exception
Klasse. Diese neue Ausnahme kann, wie andere Ausnahmen auch, mit der Methode raise
anweisung mit einer optionalen Fehlermeldung.
Wenn wir ein großes Python-Programm entwickeln, ist es eine gute Praxis, alle benutzerdefinierten Ausnahmen, die unser Programm auslöst, in einer separaten Datei abzulegen. Viele Standardmodule tun dies. Sie definieren ihre Ausnahmen separat als exceptions.py
oder errors.py
(generell, aber nicht immer).
User-defined ausnahmeklassen können alles implementieren, was eine normale Klasse tun kann, aber wir machen sie in der Regel einfach und prägnant. Die meisten Implementierungen deklarieren eine benutzerdefinierte Basisklasse und leiten andere Ausnahmeklassen von dieser Basisklasse ab. Dieses Konzept wird im folgenden Beispiel verdeutlicht.
Example: User-Defined Exception in Python
In diesem Beispiel wird veranschaulicht, wie benutzerdefinierte Ausnahmen in einem Programm verwendet werden können, um Fehler auszulösen und abzufangen.
In diesem Programm wird der Benutzer aufgefordert, eine Zahl einzugeben, bis er eine gespeicherte Zahl richtig errät. Um ihm dabei zu helfen, wird ein Hinweis gegeben, ob seine Schätzung größer oder kleiner als die gespeicherte Zahl ist.
# define Python user-defined exceptions class Error(Exception): """Basisklasse für andere Ausnahmen""" pass class ValueTooSmallError(Error): """Wird ausgelöst, wenn der Eingangswert zu klein ist""" pass class ValueTooLargeError(Error): """Wird ausgelöst, wenn der Eingangswert zu groß ist""" pass # müssen Sie diese Zahl erraten number = 10 # Benutzer rät eine Zahl, bis er/sie sie richtig hat while True: try: i_num = int(input("Eingabe einer Nummer: ")) if i_num < number: raise ValueTooSmallError elif i_num > number: 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("Herzlichen Glückwunsch! Sie haben es richtig erraten.")
Hier sehen Sie einen Probelauf dieses Programms.
Eingabe einer Nummer: 12 Dieser Wert ist zu groß, versuchen Sie es erneut! Eingabe einer Nummer: 0 Dieser Wert ist zu klein, versuchen Sie es erneut! Eingabe einer Nummer: 8 Dieser Wert ist zu klein, versuchen Sie es erneut! Eingabe einer Nummer: 10 Herzlichen Glückwunsch! Sie haben es richtig erraten.
Wir haben eine Basisklasse definiert, die Error
.
Die beiden anderen Ausnahmen (ValueTooSmallError
und ValueTooLargeError
) die tatsächlich von unserem Programm ausgelöst werden, sind von dieser Klasse abgeleitet. Dies ist der Standardweg, um in der Python-Programmierung benutzerdefinierte Ausnahmen zu definieren, aber Sie sind nicht nur auf diesen Weg beschränkt.
Customizing Exception Classes
Wir können diese Klasse weiter anpassen, um andere Argumente nach unseren Bedürfnissen zu akzeptieren.
Um das Anpassen der Exception-Klassen zu erlernen, müssen Sie über Grundkenntnisse der objektorientierten Programmierung verfügen.
Besuchen Sie Python Object Oriented Programming , um mit dem Lernen über objektorientierte Programmierung in Python zu beginnen.
Schauen wir uns ein Beispiel an:
class SalaryNotInRangeError(Exception): """Exception raised for errors in the input salary. Attributes: salary -- input salary which caused the error message -- explanation of the error """ def __init__(self, salary, message="Salary is not in (5000, 15000) range"): self.salary = salary self.message = message super().__init__(self.message) salary = int(input("Enter salary amount: ")) if not 5000 < salary < 15000: raise SalaryNotInRangeError(salary)
Output
Enter salary amount: 2000 Traceback (most recent call last): File "<string>", line 17, in <module> raise SalaryNotInRangeError(salary) __main__.SalaryNotInRangeError: Salary is not in (5000, 15000) range
Hier haben wir den Konstruktor des Exception
Klasse, um unsere eigenen benutzerdefinierten Argumente zu akzeptieren salary
und message
. Dann wird der Konstruktor des übergeordneten Exception
Klasse wird manuell mit der self.message
argument mittels super()
.
Das benutzerdefinierteself.salary
Attribut wird definiert, um später verwendet zu werden.
Die geerbte __str__
Methode der Exception
Klasse wird dann verwendet, um die entsprechende Meldung anzuzeigen, wenn SalaryNotInRangeError
wird angehoben.
Wir können auch die Methode __str__
selbst anpassen, indem wir sie überschreiben.
class SalaryNotInRangeError(Exception): """Exception raised for errors in the input salary. Attributes: salary -- input salary which caused the error message -- explanation of the error """ def __init__(self, salary, message="Salary is not in (5000, 15000) range"): self.salary = salary self.message = message super().__init__(self.message) def __str__(self): return f'{self.salary} -> {self.message}' salary = int(input("Enter salary amount: ")) if not 5000 < salary < 15000: raise SalaryNotInRangeError(salary)
Output
Enter salary amount: 2000 Traceback (most recent call last): File "/home/bsoyuj/Desktop/Untitled-1.py", line 20, in <module> raise SalaryNotInRangeError(salary) __main__.SalaryNotInRangeError: 2000 -> Salary is not in (5000, 15000) range
Um mehr darüber zu erfahren, wie Sie Ausnahmen in Python behandeln können, besuchen Sie Python Exception Handling.