Was ist die beabsichtigte Verwendung der optionalen else
Klausel der try
Erklärung?
python
exception-handling
geowa4
quelle
quelle
Antworten:
Die Anweisungen im
else
Block werden ausgeführt, wenn die Ausführung am Ende vontry
- abfällt, wenn keine Ausnahme vorliegt. Ehrlich gesagt habe ich nie einen Bedarf gefunden.Allerdings Behandeln von Ausnahmen Hinweise:
Wenn Sie also eine Methode haben, die beispielsweise eine auslösen könnte,
IOError
und Sie Ausnahmen abfangen möchten, die ausgelöst werden, möchten Sie noch etwas tun, wenn die erste Operation erfolgreich ist und Sie keinen IOError abfangen möchten Bei dieser Operation könnten Sie so etwas schreiben:Wenn Sie nur
another_operation_that_can_throw_ioerror()
nach setzenoperation_that_can_throw_ioerror
,except
würde der Fehler des zweiten Anrufs abfangen. Und wenn Sie es nach dem ganzentry
Block setzen, wird es immer ausgeführt und erst nach demfinally
. Mitelse
können Sie sicher gehenfinally
Block ausgeführt, undIOError
s, die es erhöht, werden hier nicht gefangenquelle
return
,continue
oderbreak
.Es gibt einen großen Grund für die Verwendung
else
- Stil und Lesbarkeit. Im Allgemeinen ist es eine gute Idee, Code beizubehalten, der Ausnahmen in der Nähe des Codes verursachen kann, der sich mit ihnen befasst. Vergleichen Sie zum Beispiel diese:und
Der zweite ist gut, wenn der
except
nicht vorzeitig zurückkehren oder die Ausnahme erneut auslösen kann. Wenn möglich hätte ich geschrieben:Hinweis: Die Antwort wurde von einem kürzlich veröffentlichten Duplikat hier kopiert , daher all das "AskPassword" -Ding.
quelle
Eine Verwendung: Testen Sie einen Code, der eine Ausnahme auslösen soll.
(Dieser Code sollte in der Praxis in einen allgemeineren Test abstrahiert werden.)
quelle
Die beabsichtigte Verwendung besteht darin, einen Kontext zu haben, in dem mehr Code ausgeführt werden kann, wenn es keine Ausnahmen gab, in denen erwartet wurde, dass er verarbeitet wird.
Dieser Kontext vermeidet die versehentliche Behandlung von Fehlern, die Sie nicht erwartet haben.
Aber es ist wichtig , die genauen Bedingungen zu verstehen, die sonst Klausel Sicht verursachen, weil
return
,continue
undbreak
kann den Steuerfluss zu unterbrechenelse
.Zusammenfassend
Die
else
Anweisung läuft , wenn es keine Ausnahmen und wenn nicht durch eine unterbrochenreturn
,continue
oderbreak
Aussage.Die anderen Antworten verpassen diesen letzten Teil.
Aus den Dokumenten:
(Fettdruck hinzugefügt.) Und die Fußnote lautet:
Es ist mindestens eine vorhergehende Ausnahmeklausel erforderlich ( siehe Grammatik ). Es ist also wirklich nicht "try-else", sondern "try-without-else (-finally)", wobei
else
(undfinally
) optional sind.Das Python-Tutorial erläutert die beabsichtigte Verwendung:
Beispiel für die Unterscheidung zwischen
else
Code und Code nach demtry
BlockWenn Sie einen Fehler behandeln, wird der
else
Block nicht ausgeführt. Zum Beispiel:Und nun,
quelle
Try-außer-else eignet sich hervorragend zum Kombinieren des EAFP-Musters mit Enten-Typisierung :
Sie könnten sagen, dass dieser naive Code in Ordnung ist:
Dies ist eine großartige Möglichkeit, um schwerwiegende Fehler in Ihrem Code versehentlich zu verbergen. Ich habe dort eine Bereinigung getippt, aber der AttributeError, der mich wissen lassen würde, wird verschluckt. Schlimmer noch, was wäre, wenn ich es richtig geschrieben hätte, aber die Bereinigungsmethode wurde gelegentlich an einen Benutzertyp übergeben, der ein falsch benanntes Attribut hatte, was dazu führte, dass es auf halbem Weg stillschweigend fehlschlug und eine Datei nicht geschlossen blieb? Viel Glück beim Debuggen.
quelle
Ich finde es wirklich nützlich, wenn Sie Aufräumarbeiten durchführen müssen, auch wenn es eine Ausnahme gibt:
quelle
Auch wenn Sie sich momentan keine Verwendung vorstellen können, können Sie darauf wetten, dass es eine Verwendung dafür geben muss. Hier ist ein einfallsloses Beispiel:
Mit
else
:Ohne
else
:Hier haben Sie die Variable
something
definiert, wenn kein Fehler ausgegeben wird. Sie können dies außerhalb destry
Blocks entfernen , aber dann ist eine unordentliche Erkennung erforderlich, wenn eine Variable definiert ist.quelle
something = a[2]; print something
dem try: block?Es gibt ein schönes Beispiel
try-else
in PEP 380 . Grundsätzlich kommt es darauf an, in verschiedenen Teilen des Algorithmus unterschiedliche Ausnahmebehandlungen durchzuführen.Es ist ungefähr so:
Auf diese Weise können Sie den Code für die Ausnahmebehandlung näher an die Stelle schreiben, an der die Ausnahme auftritt.
quelle
Aus Fehlern und Ausnahmen # Behandlung von Ausnahmen - docs.python.org
quelle
Wenn man sich die Python-Referenz ansieht, scheint sie
else
ausgeführt zu werden,try
wenn es keine Ausnahme gibt. Die optionale else-Klausel wird ausgeführt, wenn die Steuerung am Ende der try-Klausel abläuft. 2 Ausnahmen in der else-Klausel werden von den vorhergehenden Ausnahmen nicht behandelt.Das Eintauchen in Python hat ein Beispiel, in dem, wenn ich das richtig verstehe, im
try
Block versucht wird, ein Modul zu importieren. Wenn dies fehlschlägt, erhalten Sie eine Ausnahme und binden die Standardeinstellung. Wenn dies funktioniert, haben Sie die Möglichkeit, in denelse
Block zu gehen und die erforderlichen Elemente zu binden (siehe Link für das Beispiel und die Erklärung).Wenn Sie versucht haben, im
catch
Block zu arbeiten, könnte dies eine weitere Ausnahme auslösen - ich denke, hier ist derelse
Block nützlich.quelle
try
Block zurückkehren können.Das ist es. Der 'else'-Block einer try-exception-Klausel existiert für Code, der ausgeführt wird, wenn (und nur wenn) die versuchte Operation erfolgreich ist. Es kann verwendet und missbraucht werden.
Persönlich mag ich es und benutze es, wenn es angebracht ist. Es gruppiert Anweisungen semantisch.
quelle
Vielleicht könnte eine Verwendung sein:
Vielleicht führt dich das auch zu einer Verwendung.
quelle
Ich habe festgestellt, dass das
try: ... else:
Konstrukt in der Situation nützlich ist, in der Sie Datenbankabfragen ausführen und die Ergebnisse dieser Abfragen in einer separaten Datenbank mit demselben Geschmack / Typ protokollieren. Angenommen, ich habe viele Arbeitsthreads, die alle Datenbankabfragen verarbeiten, die an eine Warteschlange gesendet werdenWenn Sie zwischen den möglichen Ausnahmen unterscheiden können, die möglicherweise ausgelöst werden, müssen Sie dies natürlich nicht verwenden. Wenn Code jedoch auf einen erfolgreichen Code reagiert, wird möglicherweise dieselbe Ausnahme wie beim erfolgreichen Teil ausgelöst, und Sie können dies nicht einfach tun Lassen Sie die zweite mögliche Ausnahme los oder kehren Sie sofort nach Erfolg zurück (was in meinem Fall den Thread töten würde), dann ist dies praktisch.
quelle
Ein
else
Block kann häufig vorhanden sein, um die Funktionalität zu ergänzen, die in jedemexcept
Block auftritt .In diesem Fall
inconsistency_type
wird in jedem Ausnahmeblock gesetzt, so dass das Verhalten im fehlerfreien Fall in ergänzt wirdelse
.Natürlich beschreibe ich dies als ein Muster, das eines Tages in Ihrem eigenen Code auftauchen kann. In diesem speziellen Fall setzen Sie ohnehin nur
inconsistency_type
vor demtry
Block auf 0 .quelle
Hier ist ein weiterer Ort, an dem ich dieses Muster verwenden möchte:
quelle
continue
stattdessen einfach das Muster "Früh ausbrechen" verwenden. Auf diese Weise können Sie die "else" -Klausel und ihren Einzug löschen, um den Code leichter lesbar zu machen.Eines der Anwendungsszenarien, an die ich denken kann, sind unvorhersehbare Ausnahmen, die umgangen werden können, wenn Sie es erneut versuchen. Wenn die Operationen im try-Block beispielsweise Zufallszahlen enthalten:
Wenn die Ausnahme jedoch vorhergesagt werden kann, sollten Sie die Validierung immer vor einer Ausnahme auswählen. Es kann jedoch nicht alles vorhergesagt werden, so dass dieses Codemuster seinen Platz hat.
quelle
break
Inneretry
am Ende platzieren, was IMO sauberer ist, und Sie brauchen das nichtelse
. Auch dascontinue
wird nicht wirklich benötigt, kann man einfachpass
.Ich habe festgestellt, dass es
else
nützlich ist, mit einer möglicherweise falschen Konfigurationsdatei umzugehen:Eine Ausnahme beim Lesen der
lock
Konfiguration deaktiviert die Sperrüberwachung, und ValueErrors protokolliert eine hilfreiche Warnmeldung.quelle
Angenommen, Ihre Programmierlogik hängt davon ab, ob ein Wörterbuch einen Eintrag mit einem bestimmten Schlüssel hat. Sie können das Ergebnis der
dict.get(key)
Verwendung vonif... else...
Konstrukt testen oder Folgendes tun:quelle
Ich würde einen weiteren Anwendungsfall hinzufügen, der bei der Behandlung von DB-Sitzungen unkompliziert erscheint:
quelle
Der
else:
Block ist verwirrend und (fast) nutzlos. Es ist auch Teil derfor
undwhile
Aussagen.Selbst auf einer
if
Aussageelse:
kann das auf wirklich schreckliche Weise missbraucht werden, was zu Fehlern führt, die sehr schwer zu finden sind.Bedenken Sie.
Überlegen Sie zweimal
else:
. Es ist im Allgemeinen ein Problem. Vermeiden Sie es, außer in einerif
Anweisung, und dokumentieren Sie auch dann dieelse
Bedingung, um es explizit zu machen.quelle
if x > 0: return "yes"
undif x <= 0: return "no"
. Jetzt kommt eine Person und ändert eine der Bedingungen, um zu sagenx > 1
, vergisst aber, die andere zu ändern. Wie reduziert sich die Anzahl der Fehler, die begangen werden würden?if else
Klauseln sind manchmal viele Zeilen voneinander entfernt. DRY ist eine gute Praxis, viel öfter als nicht. (Entschuldigung für den doppelten Beitrag).