In diesem Tutorial lernen Sie anhand von Beispielen, wie Sie benutzerdefinierte Ausnahmen abhängig von Ihren Anforderungen definieren.
Python verfügt über zahlreiche integrierte Ausnahmen, die Ihr Programm dazu zwingen, einen Fehler auszugeben, wenn im Programm ein Fehler auftritt.
Manchmal müssen Sie jedoch möglicherweise eigene benutzerdefinierte Ausnahmen erstellen, die Ihrem Zweck dienen.
Benutzerdefinierte Ausnahmen erstellen
In Python können Benutzer benutzerdefinierte Ausnahmen definieren, indem sie eine neue Klasse erstellen. Diese Ausnahmeklasse muss entweder direkt oder indirekt von der integrierten Exception
Klasse abgeleitet werden. Die meisten integrierten Ausnahmen stammen ebenfalls aus dieser Klasse.
>>> 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 aufgerufen, CustomError
die von der Exception
Klasse erbt . Diese neue Ausnahme kann wie andere Ausnahmen mithilfe der raise
Anweisung mit einer optionalen Fehlermeldung ausgelöst werden.
Wenn wir ein großes Python-Programm entwickeln, empfiehlt es sich, alle benutzerdefinierten Ausnahmen, die unser Programm auslöst, in einer separaten Datei zu platzieren. Viele Standardmodule tun dies. Sie definieren ihre Ausnahmen separat als exceptions.py
oder errors.py
(allgemein, aber nicht immer).
Benutzerdefinierte Ausnahmeklassen können alles implementieren, was eine normale Klasse kann, aber wir machen sie im Allgemeinen einfach und präzise. Die meisten Implementierungen deklarieren eine benutzerdefinierte Basisklasse und leiten andere Ausnahmeklassen von dieser Basisklasse ab. Dieses Konzept wird im folgenden Beispiel verdeutlicht.
Beispiel: Benutzerdefinierte Ausnahme in Python
In diesem Beispiel wird veranschaulicht, wie benutzerdefinierte Ausnahmen in einem Programm verwendet werden können, um Fehler auszulösen und abzufangen.
Dieses Programm fordert den Benutzer auf, eine Nummer einzugeben, bis er eine gespeicherte Nummer richtig erraten hat. Um ihnen dabei zu helfen, es herauszufinden, wird ein Hinweis gegeben, ob ihre Vermutung größer oder kleiner als die gespeicherte Zahl ist.
# define Python user-defined exceptions class Error(Exception): """Base class for other exceptions""" pass class ValueTooSmallError(Error): """Raised when the input value is too small""" pass class ValueTooLargeError(Error): """Raised when the input value is too large""" pass # you need to guess this number number = 10 # user guesses a number until he/she gets it right while True: try: i_num = int(input("Enter a number: ")) if i_num number: raise ValueTooLargeError break except ValueTooSmallError: print("This value is too small, try again!") print() except ValueTooLargeError: print("This value is too large, try again!") print() print("Congratulations! You guessed it correctly.")
Hier ist ein Beispiellauf dieses Programms.
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 Nummer ein: 10 Herzlichen Glückwunsch! Du hast es richtig erraten.
Wir haben eine Basisklasse namens definiert Error
.
Die beiden anderen Ausnahmen ( ValueTooSmallError
und ValueTooLargeError
), die tatsächlich von unserem Programm ausgelöst werden, stammen aus dieser Klasse. Dies ist die Standardmethode zum Definieren benutzerdefinierter Ausnahmen in der Python-Programmierung. Sie sind jedoch nicht nur auf diese Weise beschränkt.
Anpassen von Ausnahmeklassen
Wir können diese Klasse weiter anpassen, um andere Argumente gemäß unseren Anforderungen zu akzeptieren.
Um die Anpassungsklassen anpassen zu können, müssen Sie über Grundkenntnisse in objektorientierter Programmierung verfügen.
Besuchen Sie Python Object Oriented Programming, um mehr über objektorientierte Programmierung in Python zu erfahren.
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)
Ausgabe
Geben Sie den Gehaltsbetrag ein: 2000 Traceback (letzter Anruf zuletzt): Datei "", Zeile 17, in Gehaltserhöhung SalotNotInRangeError (Gehalt) __main __. SalaryNotInRangeError: Das Gehalt liegt nicht im Bereich (5000, 15000)
Hier haben wir den Konstruktor der Exception
Klasse überschrieben , um unsere eigenen benutzerdefinierten Argumente salary
und zu akzeptieren message
. Dann wird der Konstruktor der übergeordneten Exception
Klasse manuell mit dem self.message
Argument using aufgerufen super()
.
Das benutzerdefinierte self.salary
Attribut wird definiert, um später verwendet zu werden.
Die geerbte __str__
Methode der Exception
Klasse wird dann verwendet, um die entsprechende Nachricht anzuzeigen, wenn sie SalaryNotInRangeError
ausgelöst wird.
Wir können die __str__
Methode auch 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)
Ausgabe
Geben Sie den Gehaltsbetrag ein: 2000 Traceback (letzter Anruf zuletzt): Datei "/home/bsoyuj/Desktop/Untitled-1.py", Zeile 20, in Raise SalaryNotInRangeError (Gehalt) __main __. SalaryNotInRangeError: 2000 -> Gehalt ist nicht in ( 5000, 15000) Bereich
Weitere Informationen zum Behandeln von Ausnahmen in Python finden Sie unter Python-Ausnahmebehandlung.