Ich bin mir nicht sicher, warum wir finally
in try...except...finally
Aussagen brauchen . Meiner Meinung nach dieser Codeblock
try:
run_code1()
except TypeError:
run_code2()
other_code()
ist das gleiche mit diesem mit finally
:
try:
run_code1()
except TypeError:
run_code2()
finally:
other_code()
Vermisse ich etwas
Sie können
finally
damit sicherstellen, dass Dateien oder Ressourcen geschlossen oder freigegeben werden, unabhängig davon, ob eine Ausnahme auftritt, auch wenn Sie die Ausnahme nicht abfangen. (Oder wenn Sie diese spezielle Ausnahme nicht abfangen .)In diesem Beispiel ist es besser, die
with
Anweisung zu verwenden, aber diese Art von Struktur kann für andere Arten von Ressourcen verwendet werden.Ein paar Jahre später schrieb ich einen Blog-Beitrag über einen Missbrauch
finally
, den die Leser vielleicht amüsant finden.quelle
Sie sind nicht gleichwertig. Schließlich wird Code ausgeführt, egal was sonst noch passiert. Dies ist nützlich für Bereinigungscode, der ausgeführt werden muss.
quelle
Finally code is run no matter what else happens
... es sei denn, es gibt eine Endlosschleife. Oder ein Stromausfall. Oderos._exit()
. Oder ...os._exit
.Um die anderen obigen Antworten zu ergänzen, wird die
finally
Klausel unabhängig davon ausgeführt, während dieelse
Klausel nur ausgeführt wird, wenn keine Ausnahme ausgelöst wurde.Wenn Sie beispielsweise ohne Ausnahmen in eine Datei schreiben, wird Folgendes ausgegeben:
AUSGABE:
Wenn es eine Ausnahme gibt, gibt der Code Folgendes aus (beachten Sie, dass ein absichtlicher Fehler dadurch verursacht wird, dass die Datei schreibgeschützt bleibt.
AUSGABE:
Wir können sehen, dass die
finally
Klausel unabhängig von einer Ausnahme ausgeführt wird. Hoffe das hilft.quelle
else
es eine Sache ist. Nützlich zu wissen.Die Codeblöcke sind nicht äquivalent. Die
finally
Klausel wird auch ausgeführt, wennrun_code1()
eine andere Ausnahme alsTypeError
oderrun_code2()
eine Ausnahme ausgelöst wird, während sieother_code()
in den ersten Fällen in diesen Fällen nicht ausgeführt wird.quelle
Was passiert in Ihrem ersten Beispiel, wenn
run_code1()
eine Ausnahme ausgelöst wird, die dies nicht istTypeError
? ...other_code()
wird nicht ausgeführt.Vergleichen Sie das mit der
finally:
Version:other_code()
wird garantiert ausgeführt, unabhängig davon, welche Ausnahme ausgelöst wird.quelle
Wie in der Dokumentation erläutert , soll die
finally
Klausel Bereinigungsaktionen definieren, die unter allen Umständen ausgeführt werden müssen .Ein Beispiel:
Wie Sie sehen, wird die
finally
Klausel auf jeden Fall ausgeführt. DasTypeError
Erhöhen durch Teilen zweier Zeichenfolgen wird von derexcept
Klausel nicht behandelt und daher nachfinally
Ausführung der Klausel erneut ausgelöst.In realen Anwendungen ist die finally-Klausel nützlich, um externe Ressourcen (wie Dateien oder Netzwerkverbindungen) freizugeben, unabhängig davon, ob die Verwendung der Ressource erfolgreich war.
quelle
Perfektes Beispiel ist wie folgt:
quelle
finally
dient zum Definieren von "Bereinigungsaktionen" . Diefinally
Klausel wird in jedem Fall ausgeführt, bevor dietry
Anweisung verlassen wird, unabhängig davon, ob eine Ausnahme (auch wenn Sie sie nicht behandeln) aufgetreten ist oder nicht.Ich stimme dem Beispiel von @ Byers zu.
quelle
Kann schließlich auch verwendet werden, wenn Sie "optionalen" Code ausführen möchten, bevor Sie den Code für Ihre Hauptarbeit ausführen, und dieser optionale Code aus verschiedenen Gründen fehlschlagen kann.
Im folgenden Beispiel wissen wir nicht genau, welche Ausnahmen auftreten
store_some_debug_info
können.Wir könnten rennen:
Die meisten Linters werden sich jedoch darüber beschweren, dass eine Ausnahme zu vage ist. Da wir uns nur
pass
für Fehler entscheiden, bietet derexcept
Block keinen wirklichen Mehrwert.Der obige Code hat den gleichen Effekt wie der 1. Codeblock, ist jedoch präziser.
quelle
Durch die jahrelange professionelle Verwendung von Delphi habe ich gelernt, meine Bereinigungsroutinen endgültig zu schützen. Delphi erzwingt so ziemlich die Verwendung von final, um alle vor dem try-Block erstellten Ressourcen zu bereinigen, damit Sie keinen Speicherverlust verursachen. So funktionieren auch Java, Python und Ruby.
und die Ressource wird bereinigt, unabhängig davon, was Sie zwischen dem Versuch und dem endgültigen Vorgang tun. Außerdem wird es nicht bereinigt, wenn die Ausführung den
try
Block nie erreicht . (dhcreate_resource
selbst löst eine Ausnahme aus) Es macht Ihren Code "Ausnahme sicher".Warum Sie eigentlich einen finally-Block benötigen, tun dies nicht alle Sprachen. In C ++, wo Sie automatisch Destruktoren aufgerufen haben, die die Bereinigung erzwingen, wenn eine Ausnahme den Stapel abrollt. Ich denke, dies ist ein Schritt in Richtung sauberer Code im Vergleich zu versuchen ... endlich Sprachen.
quelle
Ein try-Block hat nur eine obligatorische Klausel: Die try-Anweisung. Die Ausnahmeregelungen else, else und finally sind optional und basieren auf den Benutzereinstellungen.
finally: Bevor Python die try-Anweisung verlässt, wird der Code im finally-Block unter allen Bedingungen ausgeführt, auch wenn das Programm beendet wird. Wenn Python beispielsweise beim Ausführen von Code im Block Except oder else auf einen Fehler gestoßen ist, wird der Block finally weiterhin ausgeführt, bevor das Programm gestoppt wird.
quelle
Führen Sie diese Python3-Codes aus, um festzustellen, ob Folgendes erforderlich ist:
FALL 1:
FALL 2:
Versuchen Sie jedes Mal die folgenden Eingaben:
** In einem sehr frühen Stadium des Lernens von Python.
quelle
Ich habe versucht, einen Code auszuführen, in dem ich Excel-Tabellen lesen wollte. Das Problem war, wenn es eine Datei gibt, die kein Blatt mit dem Namen "SheetSum" enthält. Ich kann sie nicht an den Fehlerort verschieben. Code, den ich schrieb, war:
Fehler geben:
Ich musste einen vollständigen
try except with finally
Block hinzufügen und sagen, dassfinally
ich die Datei auf jeden Fall schließen muss, wie:Ansonsten bleibt die Datei im Hintergrund offen.
..Mehr hier
quelle