Wann sollte ich eine Ausnahme in Python unterordnen?

10

In meinem Code gibt es ungefähr sieben Stellen, an denen ich eine Ausnahme auslöse. Alle diese Ausnahmen werden gleich behandelt: Drucken Sie einen Fehler in die Protokolldatei, setzen Sie den Softwarestatus auf Standard zurück und beenden Sie das Programm.

Während der Codeüberprüfung sagte mein leitender Ingenieur, den ich sehr schätze, ich sollte alle diese Ausnahmen unterordnen. Sein Argument ist, dass wir in Zukunft die Ausnahmen möglicherweise anders behandeln möchten, und das wird einfacher.

Mein Argument ist, dass es derzeit nur unseren Code überladen wird und da wir nicht wissen, ob wir die Ausnahmen jemals anders behandeln werden, sollten wir den Code knapp lassen und, wenn und wann die Zeit kommt, dann und nur dann sollten wir einen Subtyp eingeben .

Ich würde gerne ein Argument für jeden Fall hören.

Esra
quelle
2
YAGNI ... Sie brauchen es jetzt nicht und können es später jederzeit ohne allzu große Schwierigkeiten hinzufügen.
Robert Harvey
Hast du irgendwelche Beispiele? Erhöhen Sie Exceptionzum Beispiel nur oder spezifischere eingebaute Fehler?
Jonrsharpe
nur eine Ausnahme auslösen ("spezifische Beschreibung")
Esra
Zumindest bei Esra sollten Sie prüfen, ob es eine passendere integrierte Ausnahme gibt (siehe docs.python.org/2/library/exceptions.html ).
Jonrsharpe

Antworten:

8

Du hast recht

Das Argument für Ihre Seite wird bereits von Robert Harvey erwähnt: Fügen Sie keinen Code hinzu, den Sie gerade nicht benötigen, zumal es später einfach ist, ihn hinzuzufügen.

Ihr Rezensent hat auch Recht

Andererseits ist auch der Standpunkt des Rezensenten verständlich:

  • Die Rückgabe eines Generikums Exception()ist für den Anrufer nicht sehr hilfreich: Während die Ausnahmebeschreibung einem Menschen anzeigt, was vor sich geht, kann es unmöglich sein, Ausnahmen programmgesteuert anders zu behandeln. Der Entwickler, der Ihren Code verwendet, zögert möglicherweise, die Arten von Ausnahmen zu ändern , auch aus Angst (gerechtfertigt oder nicht), etwas zu beschädigen.

    Beachten Sie, dass das Hinzufügen benutzerdefinierter Ausnahmen im Moment nicht so schwierig ist :

    class MyCustomException(Exception):
        pass
    

    ist alles, was du brauchst. Das sind nur zwei Codezeilen (da Sie möglicherweise nicht einmal eine separate Datei erstellen müssen, wenn Sie benutzerdefinierte Ausnahmen in eine Datei einfügen).

  • Der Code selbst sieht besser und besser lesbar aus.

    if price < self.PriceMinValue:
        raise OutOfRangeException("The price is inferior to zero.")
    

    sieht etwas besser lesbar aus als:

    if price < self.PriceMinValue:
        raise Exception("The price is inferior to zero.")
    

    wegen der Angabe der Art der Ausnahme:

    • Im zweiten Teil des Codes muss ich die Beschreibung lesen und vermuten, dass der Preis außerhalb des zulässigen Bereichs liegt (oder vielleicht nicht? Vielleicht gibt es Fälle, in denen der Preis negativ sein kann, z. B. Rabatte?).

    • Im ersten Code gibt ein Blick auf den Typ einen sofortigen Hinweis auf den Fehler. Es sieht so aus, als gäbe es eine Reihe zulässiger Werte für einen Preis, und der aktuelle Wert liegt außerhalb dieser Menge.

Damit?

Damit:

  • Beide Ansätze sind gültig. Wenn Sie die Ausnahmen nicht unterordnen, wenn Sie keine benutzerdefinierten Typen benötigen, haben Sie Recht. Wenn Sie die Ausnahmen in Unterklassen unterteilen, weil dies nichts kostet und später nützlich sein kann, haben Sie Recht.

  • Seien Sie konsequent mit Ihrem Team. Wenn Ihr Team häufig benutzerdefinierte Ausnahmen verwendet, verwenden Sie diese.

Arseni Mourzenko
quelle
2
Aber es gibt ein fröhliches Medium : raise ValueError('The price is less than zero'). Dies ist spezifischer als die Basis Exception, aber ohne viel Aufhebens.
Jonrsharpe
+1 für die einfache Aussage "Sei konsistent", mit einem Team, wenn du eins hast, mit dir selbst, wenn du es nicht tust.
Styne666