Sind die else
und finally
Abschnitte der Ausnahmebehandlung redundant? Gibt es beispielsweise einen Unterschied zwischen den folgenden beiden Codefragmenten?
try:
foo = open("foo.txt")
except IOError:
print("error")
else:
print(foo.read())
finally:
print("finished")
und
try:
foo = open("foo.txt")
print(foo.read())
except IOError:
print("error")
print("finished")
Kann der Inhalt von im Allgemeinen nicht else
immer in den try
und kann der Inhalt von nicht finally
einfach außerhalb des try / catch-Blocks verschoben werden? Wenn ja, was ist der Zweck von else
und finally
? Ist es nur um die Lesbarkeit zu verbessern?
Wenn Sie den Inhalt des
else
Blocks innerhalb destry
Blocks verschieben, werden auch Ausnahmen abgefangen, die während deselse
Blocks auftreten können. Wenn die LinieIn Ihrem Beispiel wird ein ausgelöst
IOError
. Ihr erstes Code-Snippet erkennt diesen Fehler nicht, während Ihr zweites Snippet dies tut. Sie versuchen,try
Blöcke im Allgemeinen so klein wie möglich zu halten , um wirklich nur die Ausnahmen abzufangen, die Sie abfangen möchten.Der
finally
Block wird immer ausgeführt, egal was passiert. Wenn dertry
Block beispielsweise einereturn
Anweisung enthält , wird einfinally
Block weiterhin ausgeführt, während Code unter dem gesamtentry
/except
Block dies nicht tut.quelle
Egal was passiert, der Block im wird
finally
immer ausgeführt. Auch wenn eine Ausnahme nicht behandelt wurde oder die Ausnahmebehandler selbst neue Ausnahmen generieren.quelle
try: print("I may raise an exception!") except: print("I will be called only if exception occur!") else: print("I will be called only if exception didn't occur!") finally: print("I will be called always!")
quelle
finally
Block immer ausgeführtElse
Block ausgeführt Wenn keine Ausnahme vorliegt.Ich ziehe es vor, den Code in einen
finally
Block zu setzen, der immer nachtry
und mit Ausnahme von Blöcken ausgeführt wird.Ich ziehe es vor, den Code in einen
else
Block zu setzen, der ausgeführt wird, wenn dietry
Klausel keine solche Ausnahme auslöstSchließlich
try: f = open("file.txt") f.write("change file") except: print("wrong") finally: f.close()
Sonst
try: f = open("file.txt") f.write("change file") except: print("wrong") else: print("log => there is not any exception") finally: f.close()
quelle