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.