Zweck von else und schließlich in der Ausnahmebehandlung

73

Sind die elseund finallyAbschnitte 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 elseimmer in den tryund kann der Inhalt von nicht finallyeinfach außerhalb des try / catch-Blocks verschoben werden? Wenn ja, was ist der Zweck von elseund finally? Ist es nur um die Lesbarkeit zu verbessern?

jhourback
quelle

Antworten:

66

finallywird ausgeführt, unabhängig davon, ob die Anweisungen im try-Block fehlschlagen oder erfolgreich sind. elsewird nur ausgeführt, wenn die Anweisungen im try-Block keine Ausnahme auslösen.

Brian Fisher
quelle
Wow, das war so viel einfacher zu verstehen, danke Sire! :)
Varun Rathore
Was nützt es dann endlich? Wir können " endlich " auch außerhalb dieses Try-außer-Blocks drucken lassen. Ich kann den Unterschied nicht verstehen
Amol Gupta
13

Wenn Sie den Inhalt des elseBlocks innerhalb des tryBlocks verschieben, werden auch Ausnahmen abgefangen, die während des elseBlocks auftreten können. Wenn die Linie

print(foo.read())

In Ihrem Beispiel wird ein ausgelöst IOError. Ihr erstes Code-Snippet erkennt diesen Fehler nicht, während Ihr zweites Snippet dies tut. Sie versuchen, tryBlöcke im Allgemeinen so klein wie möglich zu halten , um wirklich nur die Ausnahmen abzufangen, die Sie abfangen möchten.

Der finallyBlock wird immer ausgeführt, egal was passiert. Wenn der tryBlock beispielsweise eine returnAnweisung enthält , wird ein finallyBlock weiterhin ausgeführt, während Code unter dem gesamten try/ exceptBlock dies nicht tut.

Sven Marnach
quelle
12

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.

orlp
quelle
2
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!")
Nasir Shah
quelle
0

finally Block immer ausgeführt

Else Block ausgeführt Wenn keine Ausnahme vorliegt.

Ich ziehe es vor, den Code in einen finallyBlock zu setzen, der immer nach tryund mit Ausnahme von Blöcken ausgeführt wird.

Ich ziehe es vor, den Code in einen elseBlock zu setzen, der ausgeführt wird, wenn die tryKlausel keine solche Ausnahme auslöst

Schließ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()
Reza Jenabi
quelle