Ist es eine gute Übung, in Python try-except-else zu verwenden?
Von Zeit zu Zeit in Python, sehe ich den block:
try:
try_this(whatever)
except SomeException as exception:
#Handle exception
else:
return something
Was ist der Grund für den try-except-else zu bestehen?
Ich nicht, wie diese Art der Programmierung, wie es ist, mit Ausnahmen, um auszuführen flow control. Allerdings, wenn es enthalten ist, in der Sprache, es muss ein guter Grund für ihn, nicht wahr?
Es ist mein Verständnis, dass Ausnahmen nicht Fehlerund, dass Sie sollte nur verwendet werden, für außergewöhnliche Bedingungen (z.B. versuche ich zu schreiben, eine Datei in der Festplatte und es ist kein Platz mehr, oder vielleicht habe ich nicht die Berechtigung haben), und nicht für die Ablaufsteuerung.
Ich normalerweise behandeln Sie Ausnahmen, wie:
something = some_default_value
try:
something = try_this(whatever)
except SomeException as exception:
#Handle exception
finally:
return something
Oder wenn ich wirklich nicht wollen, etwas zurückzugeben, wenn eine Ausnahme passiert, dann:
try:
something = try_this(whatever)
return something
except SomeException as exception:
#Handle exception
InformationsquelleAutor der Frage Juan Antonio Gomez Moriano | 2013-04-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Python-Welt, mit Ausnahmen für flow control ist üblich und normal.
Sogar die Python-core-Entwicklern verwendet, Ausnahmen für flow-control und, Stil ist stark gebacken in der Sprache (d.h. der iterator-Protokoll verwendet StopIteration signal-loop-termination).
Darüber hinaus versuchen-außer-Stil wird verwendet, um zu verhindern, dass die race-conditions inherent in einigen der "schauen Sie-bevor-Sie-Sprung" Konstrukte. Zum Beispiel, Prüfung os.Pfad.existiert Ergebnisse in Informationen, die Sie möglicherweise out-of-date durch die Zeit, die Sie es verwenden. Ebenso Warteschlange.full gibt Informationen, die möglicherweise veraltet. Die try-except-else-Stil mehr produzieren, zuverlässigen code in diesen Fällen.
In einigen anderen Sprachen, diese Regel spiegelt Ihre kulturellen Normen, wie Sie sich in Ihren Bibliotheken. Die "Regel" beruht auch teilweise auf performance-überlegungen für diese Sprachen.
Python-kulturelle norm ist das etwas anderes. In vielen Fällen werden Sie muss Ausnahmen für den control-flow. Auch die Verwendung von Ausnahmen in Python nicht langsam die umliegenden code und den Aufruf-code, wie es in einigen Programmiersprachen, die kompiliert werden (d.h. CPython bereits implementiert code für die Ausnahme, die Kontrolle bei jedem Schritt, unabhängig davon, ob Sie tatsächlich mit Ausnahmen oder nicht).
In anderen Worten, dein Verständnis, dass "Ausnahmen sind für die außergewöhnlichen" ist eine Regel, die Sinn macht, in einige andere Sprachen, aber nicht für Python.
Neben der Hilfe zu vermeiden, race-Bedingungen, Ausnahmen sind auch sehr nützlich für das ziehen von Fehler-handling Schlingen. Dies ist eine notwendige Optimierung in interpretierten Sprachen, die nicht neigen dazu, die automatische loop-invariant code motion.
Auch Ausnahmen vereinfachen kann code ganz ein bisschen in gemeinsame Situationen, in denen die Fähigkeit, ein Problem ist weit entfernt von dort, wo das Problem entstanden ist. Zum Beispiel ist es üblich, top-level-user-interface-code aufrufen von code für die Geschäftslogik, welche wiederum erfordert low-level-Routinen. Situationen, die sich in die low-level-Routinen (wie z.B. doppelte Datensätze für eindeutige Schlüssel in der Datenbank-Zugriffe) können nur behandelt werden in top-level-code (wie der Benutzer gefragt wird, für einen neuen Schlüssel, der nicht zu Konflikten mit vorhandenen Schlüssel). Die Nutzung von Ausnahmen, die für diese Art der Steuerung-flow ermöglicht die mid-level-Routinen, um vollständig zu ignorieren das Problem und werden gut entkoppelt, dass der Aspekt von flow-control.
Es ist ein netter blog-post auf der indispensibility von Ausnahmen hier.
Finden Sie auch unter diesem Stapel Overflow Antwort: Ausnahmen sind wirklich außergewöhnliche Fehler?
Dem else-Klausel selbst ist interessant. Es läuft, wenn es keine Ausnahme, sondern vor der finally-Klausel. Das ist seine primäre Zweck.
Ohne die else-Klausel, die nur die option zum ausführen von zusätzlichem code vor der Fertigstellung wäre die plumpe Praxis von code hinzufügen, um die try-Klausel. Das ist umständlich, weil es Risiken
auslösen von exceptions im code, das war nicht beabsichtigt, geschützt werden durch den try-block.
Den use-case von laufen zusätzliche ungeschützten code vor Abschluss entsteht nicht sehr oft. Also, nicht erwarten, zu sehen, wie viele Beispiele in den veröffentlichten code. Es ist eher selten.
Anderen use-case, für die else-Klausel zum ausführen von Aktionen, die auftreten müssen, wenn keine Ausnahme Auftritt, und dass nicht auftreten, wenn Ausnahmen behandelt werden. Zum Beispiel:
Schließlich, am häufigsten wird eine else-Klausel mit einem try-block ist für ein bisschen Verschönerung (ausrichten der außergewöhnlichen Ergebnissen und außergewöhnlichen Ergebnissen auf dem gleichen level der Einrückung). Diese Nutzung ist immer optional und nicht unbedingt notwendig.
InformationsquelleAutor der Antwort Raymond Hettinger
Einen
try
block können Sie auf einen zu erwartenden Fehler. Dieexcept
- block darf nur exceptions fangen, die Sie bereit sind zu handhaben. Wenn Sie mit einem unerwarteten Fehler, der code kann das falsche tun und verstecken Fehler.Einer
else
- Klausel ausgeführt wird, wenn keine Fehler aufgetreten sind, und nicht ausführen, die code in dertry
block, Sie vermeiden, fangen einen unerwarteten Fehler. Wieder, Fang ein unerwarteter Fehler verstecken können bugs.Beispiel
Beispiel:
"Versuchen Sie, mit Ausnahme von" suite hat zwei optionale Klauseln
else
undfinally
. Also ist es eigentlichtry-except-else-finally
.else
bewerten nur, wenn es keine Ausnahme von dertry
block. Es ermöglicht uns zu vereinfachen, desto komplizierter folgenden code:also, wenn wir vergleichen Sie in einer
else
auf die alternative (die möglicherweise Fehler erstellen) wir sehen, dass es reduziert den code-Zeilen, und wir können mehr lesbar, wartbar und weniger buggy code-Basis.finally
finally
wird ausgeführt, egal was, auch wenn eine andere Zeile ausgewertet wird mit einer return-Anweisung.Zerlegt mit pseudo-code
Könnte es helfen zu brechen diese nach unten in die kleinste mögliche form, das zeigt alle Merkmale, mit Kommentaren. Angenommen, diese syntaktisch korrekte (aber nicht lauffähig, es sei denn, die Namen definiert sind) pseudo-code ist in einer Funktion.
Beispiel:
Es ist wahr, dass wir könnte fügen Sie den code in der
else
block in dertry
block statt, wo es laufen würde, wenn es keine Ausnahmen, aber was ist, wenn im code selbst wirft eine Ausnahme von der Art, die wir fangen? Verlassen Sie an dertry
block verbergen würde dass bug.Wollen wir minimieren Zeilen code in der
try
block zu vermeiden, abfangen von Ausnahmen, die wir nicht erwartet haben, nach dem Grundsatz, dass, wenn unser code nicht, wir wollen es, scheitern laut. Dies ist ein best practice.In Python, die meisten Ausnahmen sind Fehler, die.
Wir können die exception-Hierarchie mithilfe von pydoc. Zum Beispiel in Python 2:
oder Python 3:
Wird uns die Hierarchie. Wir können sehen, dass die meisten Arten von
Exception
sind Fehler, obwohl Python verwendet, einige von Ihnen für Dinge wie Endefor
Schleifen (StopIteration
). Dies ist die Python-3 - Hierarchie:Ein Kommentator fragte:
Nein, Sie müssen nicht wieder die Ausnahme, nur reraise es mit einem nackten
raise
zur Erhaltung der stacktrace.Oder in Python 3 können Sie erhöhen, eine neue Ausnahme und die Erhaltung der backtrace mit Ausnahme Verkettung:
Ich aufwändig meine Antwort hier.
InformationsquelleAutor der Antwort Aaron Hall
Python nicht, abonnieren Sie die Idee, dass Ausnahmen sollten nur für Ausnahmefälle, in der Tat, das idiom ist 'bitte um Vergebung, nicht-Erlaubnis". Dies bedeutet, dass mit Ausnahmen als eine routine Teil Ihres flow control ist durchaus akzeptabel, und in der Tat, ermutigt.
Dies ist in der Regel eine gute Sache, da die Arbeit auf diese Weise vermeiden, dass einige Fragen (als ein offensichtliches Beispiel, race conditions werden oft vermieden), und es neigt dazu, den code ein wenig lesbarer zu gestalten.
Stellen Sie sich vor Sie haben eine situation, wo Sie einige Benutzereingaben, die verarbeitet werden muss, sondern haben eine Standardeinstellung, die bereits verarbeitet wird. Die
try: ... except: ... else: ...
Struktur sorgt für sehr lesbaren code:Vergleichen, wie es vielleicht in anderen Sprachen:
Beachten Sie die Vorteile. Es gibt keine Notwendigkeit zu prüfen, ist der Wert gültig ist und analysieren Sie diese einzeln, Sie sind auch einmal gemacht. Der code ergibt sich auch ein logischer Fortschritt, der Haupt-code-Pfad ist der erste, gefolgt von "wenn es nicht funktioniert, tun dies'.
Beispiel ist natürlich ein wenig konstruiert, aber es zeigt, gibt es Fälle, die für diese Struktur.
InformationsquelleAutor der Antwort Gareth Latty
Die Antwort zu diesem ist, dass es kontextabhängig ist. Wenn Sie dies tun:
Es zeigt, dass Sie nicht wissen, Python sehr gut. Diese Funktionalität wird gekapselt in der
dict.get
Methode:Den
try
/except
block ist viel mehr visuell zu überladen und die ausführliche Art und Weise des Schreibens, was eine effiziente Ausführung in einer einzigen Zeile mit einem atomic-Methode. Es gibt andere Fälle, in denen dies wahr ist.Jedoch, das bedeutet nicht, dass wir sollten vermeiden, alle exception-handling. In einigen Fällen ist es bevorzugt, um Wettlaufsituationen zu vermeiden. Nicht überprüfen, ob eine Datei existiert, nur versuchen, es zu öffnen, und fangen Sie die entsprechenden IOError. Aus Gründen der Einfachheit und Lesbarkeit, versuchen Sie diese Kapseln oder Faktor es aus, wie apropos.
Lesen Sie die Zen of Pythonzu verstehen, dass es Prinzipien gibt, die in Spannung, und vorsichtig sein dogma stützt sich zu sehr auf irgendwelche Aussagen.
InformationsquelleAutor der Antwort Aaron Hall
Sollten Sie vorsichtig sein, über die Verwendung der finally-block, so es ist nicht das gleiche wie die Verwendung eines else-block in den try, except. Der finally-block wird ausgeführt, unabhängig von den Ergebnissen der versuche außer.
Wie jeder bemerkt hat mit dem else-block bewirkt, dass Ihr code besser lesbar und nur ausgeführt wird, wenn eine exception wird nicht geworfen
InformationsquelleAutor der Antwort Greg
Wann immer Sie dies Lesen:
Oder auch dieses:
Berücksichtigen Sie dies:
InformationsquelleAutor der Antwort Rajiv Bakulesh Shah
Dies ist mein einfaches snippet auf howto verstehen try-except-else-finally-block in Python:
Lassen Sie uns versuchen div 1/1:
Lassen Sie uns versuchen div 1/0
InformationsquelleAutor der Antwort zakiakhmad
Siehe das folgende Beispiel, das veranschaulichen alles über try-except-else-endlich:
Implementieren es und kommen durch:
InformationsquelleAutor der Antwort JawSaw
OP SIND SIE RICHTIG. Die sonst nach try/außer in Python ist hässlich. es führt zu einer anderen flow-control-Objekt, wo keiner benötigt wird:
Ganz klare äquivalent ist:
Dies ist weit klarer als eine else-Klausel. Die sonst nach try/except ist nicht Häufig geschrieben, so dauert es einen moment, um herauszufinden, was die Auswirkungen sind.
Nur weil Sie tun KÖNNEN, eine Sache, bedeutet nicht, Sie SOLLTEN etwas tun.
Viele Funktionen wurden Hinzugefügt, um die Sprachen, weil jemand dachte, es könnte in handliches kommen. Das Problem ist, je mehr Funktionen, desto weniger klar und offensichtlich, wie die Dinge sind, weil die Menschen nicht in der Regel verwenden Sie diese Glocken und Trillerpfeifen.
Nur meine 5 Cent hier. Ich habe zu kommen, hinter und bereinigen eine ganze Menge code geschrieben, die von 1.-Jahres-college-Entwickler, die denken, Sie sind schlau und wollen, um code zu schreiben in einigen uber-engen, Super-effizienten Weg, wenn Sie, dass macht es nur ein Chaos zu versuchen, und Lesen /ändern später. Ich vote für die Lesbarkeit jeden Tag und zweimal am Sonntag.
InformationsquelleAutor der Antwort Kevin J. Rice