Python try-else
Was ist der Verwendungszweck der optionalen else
Klausel der try-Anweisung?
Die beabsichtigte Verwendung ist es, einen Kontext für mehr Code zu haben, der ausgeführt werden kann, wenn es keine Ausnahmen gab, wo es erwartet wurde, behandelt zu werden.
Dadurch wird vermieden, dass versehentlich Fehler behandelt werden, die Sie nicht erwartet haben.
Es ist jedoch wichtig, die genauen Bedingungen zu verstehen, die dazu führen, dass die else-Klausel ausgeführt wird, denn return
, continue
et break
kann den Kontrollfluss unterbrechen, um else
.
Zusammenfassung
Le site else
Anweisung läuft, wenn es ノー Ausnahmen und wenn nicht unterbrochen durch eine return
, continue
, oder break
Erklärung.
In den anderen Antworten fehlt dieser letzte Teil.
Aus den Unterlagen:
Die fakultative else
Klausel wird ausgeführt, wenn und sobald die Kontrolle fließt aus dem Ende der try
Klausel.*
(Fettdruck hinzugefügt.) Und die Fußnote lautet:
*Gegenwärtig fließt die Kontrolle "vom Ende weg", außer im Falle einer Ausnahme oder der Ausführung eines return
, continue
, oder break
Erklärung.
Sie erfordert mindestens eine vorangehende Ausnahmeklausel ( siehe die Grammatik ). Es handelt sich also nicht um "try-else", sondern um "try-except-else(-finally)", wobei die else
(und finally
), die fakultativ sind.
Le site Python-Anleitung wird der Verwendungszweck näher erläutert:
Die Anweisung try ... except hat eine optionale else-Klausel, die, wenn sie vorhanden ist, allen except-Klauseln folgen muss. Sie ist nützlich für Code, der ausgeführt werden muss, wenn die try-Klausel keine Ausnahme auslöst. Für Beispiel:
for arg in sys.argv[1:]:
try:
f = open(arg, 'r')
except IOError:
print 'cannot open', arg
else:
print arg, 'has', len(f.readlines()), 'lines'
f.close()
Die Verwendung der else-Klausel ist besser als das Hinzufügen von zusätzlichem Code zur Try-Klausel hinzuzufügen, weil dadurch vermieden wird, dass versehentlich eine Ausnahme abgefangen wird die nicht durch den Code ausgelöst wurde, der durch die try ... except Anweisung geschützt ist.
Beispiel zur Differenzierung else
gegenüber dem Code nach der try
Block
Wenn Sie einen Fehler behandeln, wird die else
Block wird nicht ausgeführt. Zum Beispiel:
def handle_error():
try:
raise RuntimeError('oops!')
except RuntimeError as error:
print('handled a RuntimeError, no big deal.')
else:
print('if this prints, we had no error!') # won't print!
print('And now we have left the try block!') # will print!
Und jetzt,
>>> handle_error()
handled a RuntimeError, no big deal.
And now we have left the try block!
5 Stimmen
Die meisten Antworten scheinen sich darauf zu konzentrieren, warum wir das Material in der else-Klausel nicht einfach in die try-Klausel selbst einfügen können. Die Frage stackoverflow.com/questions/3996329 fragt ausdrücklich, warum der Code der else-Klausel nicht gehen kann nach der Try-Block selbst, und diese Frage ist mit dieser hier verknüpft, aber ich sehe hier keine klare Antwort auf diese Frage. Ich glaube stackoverflow.com/a/3996378/1503120 beantwortet diese Frage in hervorragender Weise. Ich habe auch versucht, die verschiedenen Bedeutungen der einzelnen Klauseln zu erläutern stackoverflow.com/a/22579805/1503120 .
2 Stimmen
Wenn die Ausnahme nicht auslöst, soll vor der abschließenden Bereinigung etwas geschehen, das nicht selbst die gleiche Ausnahmebehandlung auslösen soll.
5 Stimmen
Nachdem ich vergessen hatte, was
else
tut intry/else
yfor/else
Ich habe es mehrmals mit dem Begriffnoexcept
ynobreak
in diesen jeweiligen Zusammenhängen. Ich persönlich halte es für eine so unglückliche Überfrachtung des Wortes, dass ich versuche, es nach Möglichkeit zu vermeiden, da es die Leute, die den Code lesen, dazu zwingt, sich zu fragen: "Was macht dieses Ding nochmal?" Normalerweise ist ein Flag, einecontinue
obreak
Aussage kann das, was ich ausdrücken will, mit wenigen zusätzlichen Zeilen, aber sicherlich mit mehr Klarheit wiedergeben (wenn die Popularität der Frage ein Hinweis darauf ist).0 Stimmen
Es ist besser, sie zu nennen
except-else
anstelle vontry-else
.