logo

Benutzerdefinierte Ausnahmen in Python mit Beispielen

Benutzerdefinierte Ausnahmen werden erstellt, indem eine neue Klasse definiert wird, von der erbt Pythons integrierte Ausnahme Klasse oder eine ihrer Unterklassen. Auf diese Weise können wir benutzerdefinierte Fehlermeldungen erstellen und bestimmte Fehler auf eine für unsere Anwendung sinnvolle Weise behandeln.

Schritte zum Erstellen und Verwenden benutzerdefinierter Ausnahmen

Befolgen Sie diese Schritte, um benutzerdefinierte Ausnahmen in Python zu erstellen und zu verwenden:



  • Definieren Sie eine neue Ausnahmeklasse: Erstellen Sie eine neue Klasse, die von Exception oder einer seiner Unterklassen erbt.
  • Lösen Sie die Ausnahme aus: Verwenden Sie die raise-Anweisung, um die benutzerdefinierte Ausnahme auszulösen, wenn eine bestimmte Bedingung auftritt.
  • Behandeln Sie die Ausnahme: Verwenden Sie Try-Exception-Blöcke, um die benutzerdefinierte Ausnahme zu behandeln.

Beispiel: In diesem Beispiel erstellen wir eine benutzerdefinierte Ausnahme InvalidAgeError, um sicherzustellen, dass Alterswerte in einen gültigen Bereich (0–120) fallen.

Python
# Step 1: Define a custom exception class class InvalidAgeError(Exception): def __init__(self age msg='Age must be between 0 and 120'): self.age = age self.msg = msg super().__init__(self.msg) def __str__(self): return f'{self.age} -> {self.msg}' # Step 2: Use the custom exception in your code def set_age(age): if age < 0 or age > 120: raise InvalidAgeError(age) else: print(f'Age set to: {age}') # Step 3: Handling the custom exception try: set_age(150) # This will raise the custom exception except InvalidAgeError as e: print(e) 

Ausgabe
150 -> Age must be between 0 and 120 

Erläuterung:

  • Die InvalidAgeError-Klasse erbt von Exception. Es definiert eine __heiß__ Methode zum Akzeptieren von Alter und Nachricht.
  • Die Methode __str__ gibt eine lesbare Zeichenfolgendarstellung des Fehlers zurück.
  • Wenn in set_age() das Alter außerhalb des gültigen Bereichs (0–120) liegt, wird die Ausnahme ausgelöst.
  • Der Try-Exception-Block fängt die Ausnahme ab und gibt die Fehlermeldung aus.

Anpassen von Ausnahmeklassen

Wenn wir eine benutzerdefinierte Ausnahme erstellen, erstellen wir eine Unterklasse der in Python integrierten Exception-Klasse (oder einer Unterklasse wie ValueError, TypeError usw.). Anschließend können wir unsere eigenen Attributmethoden oder benutzerdefinierte Logik hinzufügen, um unsere Ausnahme informativer zu gestalten.



Wir können benutzerdefinierte Ausnahmen auch verbessern, indem wir zusätzliche Attribute hinzufügen oder Methoden überschreiben.

Beispiel: Hier verbessern wir den InvalidAgeError, indem wir einen Fehlercode hinzufügen und die Fehlermeldung anpassen.

Python
class InvalidAgeError(Exception): def __init__(self age msg='Age must be between 0 and 120' error_code=1001): self.age = age self.msg = msg self.error_code = error_code super().__init__(self.msg) def __str__(self): return f'[Error Code {self.error_code}] {self.age} -> {self.msg}' try: set_age(150) # This will raise the custom exception except InvalidAgeError as e: print(e) 

Ausgabe
[Error Code 1001] 150 -> Age must be between 0 and 120 

Erläuterung:



  • InvalidAgeError verfügt jetzt über ein zusätzliches Attribut error_code.
  • Die Methode __str__ wird überschrieben, um sowohl den Fehlercode als auch das Alter anzuzeigen.
  • Wenn set_age(150) ausgeführt wird, wird die Ausnahme ausgelöst und im try-exclusive-Block abgefangen.
  • Die angepasste Fehlermeldung wird gedruckt, um den Fehler aussagekräftiger zu machen.

Verwendung von Standardausnahmen als Basisklasse

Anstatt direkt von Exception zu erben, können wir manchmal eine benutzerdefinierte Ausnahme erstellen, indem wir eine Unterklasse einer Standardausnahme wie RuntimeError ValueError usw. erstellen. Dies ist nützlich, wenn Ihre benutzerdefinierte Ausnahme als eine bestimmte Art von Fehler behandelt werden soll.

Beispiel: Dieses Beispiel zeigt, wie Sie eine benutzerdefinierte Ausnahme „NetworkError“ erstellen, indem Sie von „RuntimeError“ erben, einer standardmäßig integrierten Ausnahme.

Python
# NetworkError has base RuntimeError and not Exception class NetworkError(RuntimeError): def __init__(self arg): self.args = (arg) # store as tuple try: raise NetworkError('Connection failed') except NetworkError as e: print(e.args) 

Ausgabe
('Connection failed') 

Erläuterung:

  • NetworkError erbt von RuntimeError, einem integrierten Ausnahmetyp.
  • Beim Auslösen wird die Nachricht im args-Attribut als Tupel gespeichert.
  • Die Ausnahme wird abgefangen und ihre gespeicherten Argumente werden angezeigt.

Beispiel aus der Praxis: Ungültige E-Mail-Fehler

Hier ist ein einfaches Beispiel, bei dem wir eine benutzerdefinierte Ausnahme auslösen, wenn die E-Mail-Adresse ungültig ist:

Python
class InvalidEmailError(Exception): def __init__(self email msg='Invalid email format'): self.email = email self.msg = msg super().__init__(self.msg) def __str__(self): return f'{self.email} -> {self.msg}' def set_email(email): if '@' not in email: raise InvalidEmailError(email) print(f'Email set to: {email}') try: set_email('userexample.com') except InvalidEmailError as e: print(e) 

Ausgabe
userexample.com -> Invalid email format 

Erläuterung:

  • Zur Validierung von E-Mail-Adressen wird eine neue Ausnahmeklasse InvalidEmailError definiert.
  • Wenn die angegebene E-Mail kein „@“ enthält, wird die Ausnahme ausgelöst.
  • Der Try-Exception-Block fängt den Fehler ab und gibt die formatierte Nachricht aus.

Wann werden benutzerdefinierte Ausnahmen verwendet?

Benutzerdefinierte Ausnahmen sollten in den folgenden Szenarien berücksichtigt werden:

  • Darstellung spezifischer Fehler in einer Anwendung (z. B. InvalidAgeError DatabaseConnectionError).
  • Bereitstellung klarerer und aussagekräftigerer Fehlermeldungen.
  • Behandeln Sie eine Gruppe zusammengehöriger Fehler separat mit „außer“.

Durch die Verwendung benutzerdefinierter Ausnahmen werden Programme besser lesbar, wartbar und einfacher zu debuggen.