Raise exception vs. Rendite Keine Funktionen?
Was ist besser der Praxis in eine Benutzer-definierte Funktion in Python: raise
eine Ausnahme oder return None
? Ich habe zum Beispiel eine Funktion, findet die Letzte Datei in einem Ordner.
def latestpdf(folder):
# list the files and sort them
try:
latest = files[-1]
except IndexError:
# Folder is empty.
return None # One possibility
raise FileNotFoundError() # Alternative
else:
return somefunc(latest) # In my case, somefunc parses the filename
Weitere option ist lassen Sie die Ausnahme und behandeln, die im aufrufenden code, aber ich finde es übersichtlicher ist, sich mit einem FileNotFoundError
als ein IndexError
. Oder ist es schlechte form zu re-raise eine Ausnahme mit einem anderen Namen?
- Ähnlich: stackoverflow.com/questions/1152541/...
- Ich lehne mich in Richtung auslösen einer exception, so bin ich gezwungen, Sie zu behandeln der Ausnahme in der aufrufenden Funktion. Wenn ich vergessen habe, zu prüfen, ob die Ausgabe ist Keiner in der aufrufenden Funktion, ich hätte einen latenten Fehler. Wenn Sie wieder Keine, hoffentlich, in der nächsten Zeile in der aufrufenden Funktion zu erhöhen wird ein AttributeError. Allerdings, wenn der zurückgegebene Wert wird Hinzugefügt, ein Wörterbuch und dann 100 Funktionsaufrufe in einer anderen source-Datei eine AttributeError ausgelöst wird, haben Sie Spaß, die Jagd nach, warum, der Wert war Keiner.
- Im Allgemeinen bin ich auch vermeiden, dass Werte, die eine Besondere Bedeutung haben oder mehrere Signaturen für eine Funktion (es kann auch geben einen string zurück oder None).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist wirklich eine Sache der Semantik. Was bedeutet
foo = latestpdf(d)
bedeuten?Ist es durchaus sinnvoll, dass es keine aktuelle Datei? Dann sicher nur wieder Keiner.
Erwarten Sie finden immer eine aktuelle Datei? Lösen Sie eine Ausnahme aus. Und ja, re-raise eine weitere entsprechende Ausnahme ist in Ordnung.
Ist dies nur eine Allgemeine Funktion, die eigentlich gelten für jedes Verzeichnis, das ich tun würde, die ehemaligen und zurück Keine. Wenn das Verzeichnis ist, z.B.,, bedeutet, um eine bestimmte Daten-Verzeichnis, das eine Anwendung enthält den bekannten Satz von Dateien, würde ich zu einer Ausnahme.
None
.Ich würde ein paar Vorschläge, bevor der Beantwortung Ihrer Frage, wie kann es die Frage beantworten, für Sie.
latestpdf
bedeutet sehr wenig, aber jeder blickt über Ihre Funktionlatestpdf()
bekommt die neuesten pdf. Ich würde vorschlagen, Sie nennen esgetLatestPdfFromFolder(folder)
.Sobald ich dies getan habe, wurde klar, was zurückgegeben werden soll.. Wenn es nicht ein pdf zu einer Ausnahme. Aber warten gibt es mehr..
Hoffe, das hilft!
Ich in der Regel lieber auf Ausnahmen, die intern (d.h. try/außer innerhalb der aufgerufenen Funktion, möglicherweise eine Rückkehr None), weil python ist dynamisch typisiert. Im Allgemeinen, ich halte es für ein Urteil nennen die eine oder andere Weise, aber in einer dynamisch typisierten Sprache, es sind kleine Faktoren, die den Ausschlag zu Gunsten der nicht durch die Ausnahme an den Aufrufer:
if val is None
ist ein wenig einfacher alsexcept ComplicatedCustomExceptionThatHadToBeImportedFromSomeNameSpace
. Im ernst, ich hasse es, daran zu erinnern, zu gebenfrom django.core.exceptions import ObjectDoesNotExist
an der Oberseite der alle meine django-Dateien einfach zu handhaben, ein wirklich üblicher Fall. In einer statisch typisierten Welt, lassen Sie den editor, der es für Sie tun.Ehrlich, obwohl, es ist immer ein Urteil-Aufruf, und die situation, die du beschreibst, wo die aufgerufene Funktion erhält eine Fehlermeldung, es kann nicht helfen, ist ein guter Grund, um re-raise eine Ausnahme, die sinnvoll ist. Sie haben genau die richtige Idee, aber es sei denn, du bist Ausnahme liefern aussagekräftige Informationen in einen stack-trace als
die in neun von zehn, ist das, was der Anrufer sehen, wenn Sie eine unbehandelte Keiner, nicht die Mühe.
(Alle diese Art von macht mich wünschen, dass python Ausnahmen hatten die
cause
Attribute standardmäßig als in java, können Sie pass-Ausnahmen in neuen Ausnahmen, so dass Sie rethrow alles, was Sie wollen und verlieren Sie nie die ursprüngliche Quelle des Problems.)Im Allgemeinen würde ich sagen, dass eine Ausnahme geworfen werden sollte, wenn etwas katastrophal aufgetreten ist, kann nicht wiederhergestellt werden (D. H. Ihrer Funktion befasst sich mit einigen internet-Ressource, die nicht verbunden sein), und sollten Sie wieder "None", wenn Sie Ihre Funktion sollte wirklich etwas von dem zurückgeben, aber nichts würde angemessene Rendite (also "None", wenn die Funktion versucht, einen Teilstring in einem string z.B.).
mit python 3.5 ist Eingabe:
Beispiel-Funktion bei der Rückkehr Keiner wird sein:
und beim auslösen einer Ausnahme wird sein:
option 2 scheinen mehr lesbar und pythonic
(+option Kommentar hinzufügen einer Ausnahme, wie bereits erwähnt.)
Union[str, None]
sollteOptional[str]