Im Allgemeinen sollten Sie Ihre eigenen Ausnahmen nur dann definieren, wenn Sie einen bestimmten Fall haben, in dem das Auslösen einer benutzerdefinierten Ausnahme sinnvoller wäre als das Erweitern einer vorhandenen Python-Ausnahme.
Zum Beispiel sagen, dass ich eine Befehlszeilenargument-Parsing-API implementierte, und ich musste den Fall berücksichtigen, in dem ein Benutzer ein ungültiges Befehlszeilenargument eingibt, was auch immer es sein mag. Jetzt kann ich einfach eine Python-Ausnahme wie SyntaxError
oder auslösen, aber das wäre eine schlechte Design-Entscheidung.
Ich möchte an den Benutzer zu übermitteln können, warum eine Ausnahme ausgelöst wird, nicht nur, dass eine Ausnahme ausgelöst wird. Eine bessere Option wäre, die allgemeine Ausnahmeklasse Exception
zu unterklassifizieren und eine spezifische benutzerdefinierte Ausnahme zu erstellen. Vielleicht InvalidCommandLineArgument
.
Jetzt, anstatt eine allgemeine Python-Ausnahme zu verwenden, kann ich meine benutzerdefinierte Ausnahme verwenden, die hilft, den Benutzer klar und prägnant über ihren Fehler zu informieren.
Dies kann auch nützlich sein, wenn Sie informiert werden möchten, wenn eine bestimmte Aktion in Ihrem Code fehlschlägt. Wenn Sie z. B. eine Funktion zum Herunterladen einer Zertifikatsdatei aus dem Internet erstellen, kann sie eine Ausnahme vom Typ NoInternetConnection
auslösen, um Sie darüber zu informieren, wenn die Internetverbindung unterbrochen ist. Auf diese Weise können Sie eine bestimmte Aktion basierend auf der ausgelösten Ausnahme ausführen.
Jetzt können Sie sich fragen, warum im zweiten Fall Sie nicht einfach eine bedingte Anweisung zu Test verwenden können, wenn es eine Internetverbindung gab, bevor Sie versuchen, es zu verwenden. Der Grund, warum Sie sich für das Spätere entscheiden, liegt darin, dass das Motto in Python lautet: "Um Vergebung zu bitten, ist einfacher, als um Erlaubnis zu bitten." Dies bedeutet, dass es einfacher ist, Python zu fragen, ob eine Ausnahme ausgelöst werden soll, als wenn versucht wird, alle möglichen Fehler mit bedingten Anweisungen zu umgehen.
Am Ende, es ist nicht über „ Haben Sie Ihre eigenen Ausnahmen in Python implementieren?“, Sondern „Wenn sehen Sie Ihre eigenen Ausnahmen in Python implementieren?“
Im Gegensatz zu den meisten anderen Sprachen sind Ausnahmen in Python relativ günstig und werden regelmäßig als verherrlichte GOTO verwendet - oft werden für die Flusskontrolle benutzerdefinierte Ausnahmen verwendet. –
Interessant ... "für Flusskontrolle verwendet" bedeutet benutzerdefinierte Ausnahme wird manchmal für keine außergewöhnliche Situation verwendet? – Pythoner
Ja. Das beste Beispiel ist die 'for'-Schleife: Wenn das iterable erschöpft ist, wird StopIteration ausgelöst. Dies ist nicht außergewöhnlich, das Iterator-Protokoll ist der Kern der Sprache. –