Ich habe eine Funktion, die eines von drei Dingen zurückgeben kann:
- Erfolg (
True) - Fehler (
False) - Fehler beim Lesen / Parsen von Stream (
None)
Meine Frage ist, ob ich nicht gegen Trueoder testen soll False, wie ich das Ergebnis sehen soll. Unten ist, wie ich es gerade mache:
result = simulate(open("myfile"))
if result == None:
print "error parsing stream"
elif result == True: # shouldn't do this
print "result pass"
else:
print "result fail"
Ist es wirklich so einfach wie das Entfernen des == TrueTeils oder sollte ich einen Tri-Bool-Datentyp hinzufügen? Ich möchte nicht, dass die simulateFunktion eine Ausnahme auslöst, da das äußere Programm nur einen Fehler protokollieren und fortfahren soll.
simulateFunktion fange ich alle Ausnahmen ab; Ich möchte nicht, dass irgendetwas, das im Simulator passiert, den Rest des Programms stoppt (und das nächste Element verarbeitet). Aber die Antworten bringen mich dazu, meine Meinung zu ändern.
simulateDinge haben, die es fangen und erneut versuchen kann, ist das gut. Aber wenn es "fehlschlägt", sollte es nicht zurückkehren None. Es sollte nur eine Ausnahme zu dem Skript auslösen, das es aufgerufen hat. So oder so simulateist es geschafft. Die Rückgabe Noneist nicht so hilfreich wie das Auslösen einer richtigen Ausnahme - oder das Weitergeben einer Ausnahme simulatein das aufrufende Skript zur Behandlung.
except Exception:stattdessen. Dies fängt alle "echten" Fehler zusammen mit Warningund ab StopIteration. Es erlaubt KeyboardInterruptund SystemExitdurch. Wenn Sie diese wirklich fangen möchten, ist es wahrscheinlich am besten, einen anderen äußeren Versuch / eine andere Struktur zu verwenden, die Ihre Absicht klar dokumentiert, da dies keine "Fehler" sind. (Aber ich habe "fast nie" gesagt ... vielleicht möchten Sie in Ihrem Fall wirklich alles ergreifen und sogar Strg-C verhindern oder das sys.exit()Verlassen beenden usw.)