2010-03-29 3 views
202

Was ist der Unterschied zwischen ist '' und 'wie' in außer Aussagen, zB:Python versucht ... außer Komma vs 'als' in der Ausnahme

try: 
    pass 
except Exception, exception: 
    pass 

und:

try: 
    pass 
except Exception as exception: 
    pass 

Ist die zweite Syntax in 2.6 legal? Es funktioniert in CPython 2.6 unter Windows, aber der 2.5 Interpreter in Cygwin beschwert sich, dass es ungültig ist.

Wenn beide in 2.6 gültig sind, was sollte ich verwenden?

Antwort

229

Das endgültige Dokument ist PEP-3110: Catching Exceptions

Zusammenfassung:

  • In Python 3.x mit as erforderlich ist eine Ausnahme von einer Variablen zugewiesen werden.
  • Verwenden Sie in Python 2.6+ die as-Syntax, da diese weit weniger eindeutig und vorwärtskompatibel zu Python 3.x ist. Verwenden Sie in Python 2.5 und früheren Versionen die Komma-Version, da as nicht unterstützt wird.
+12

Die Verwendung von 'as' ist die einzige Möglichkeit, die Ausnahme einem lokalen in Python 3.x zuzuordnen. Aber 'as' ist nicht _required_, da Sie es nicht angeben müssen, wenn Sie es überhaupt nicht benötigen. – mercator

17

Die "as" -Syntax wird bevorzugt, wenn der Code jedoch mit älteren Python-Versionen arbeiten muss (2.6 unterstützt als erster den neuen), müssen Sie die Kommasyntax verwenden.

33

Ja, es ist legal. Ich bin mit Python 2,6

try: 
    [] + 3 
except Exception as x: 
    print "woo hoo" 

>>> 
woo hoo 

aktualisieren: Es gibt einen weiteren Grund, die as Syntax zu verwenden. Die Verwendung von , macht die Dinge viel mehrdeutig, wie andere darauf hingewiesen haben; und hier ist, was den Unterschied ausmacht. Ab Python 2.6 gibt es multicatch, die Sie zu catch multiple exceptions in one except block ermöglicht. In einer solchen Situation ist es ausdrucksvoller und pythonic

except (exception1, exception2) as e 

eher zu sagen, als

except (exception1, exception2), e 

zu sagen, welche noch

+13

Python-Versionen * vor * 2.6 ermöglichten es, ein Tupel zu verwenden, um auch mehrere Ausnahmetypen zu erfassen. Aber die Syntax war verwirrend; Sie würden 'except NameError, ValueError:' verwenden und sich dann gefragt, warum die 'ValueError'-Ausnahme nie abgefangen wurde. Oder benutzt 'except (NameError, e):' und hinterließ einen 'NameError' für '' e''! –

7

funktionieren würde Wenn Sie alle Python-Versionen unterstützen möchten Sie die verwenden können, sys.exc_info() Funktion wie folgt:

try: 
    a = 1/'0' 
except (ZeroDivisionError, TypeError): 
    e = sys.exc_info()[1] 
    print(e.args[0]) 

(Quelle: http://python3porting.com/noconv.html)

+1

Hinweis: Es gibt einige Ecken Fälle hier zu beachten.In Py3 wird das 'as' Ziel (zusammen mit dem Rest der Ausnahmeinfo) implizit" del'ed ", sobald Sie den' except' Block verlassen (dies verhindert, dass einige zyklische Referenzen, die im gespeicherten Traceback involviert sind, die Freigabe von verzögern) Speicher, bis der zyklische GC zum Laufen kommt). Dieser äquivalente Code ist etwas weniger äquivalent, es sei denn, Sie verwenden einen "try/finally" innerhalb des "except" -Blocks, um sicherzustellen, dass "del e" ausgeführt wird, bevor der "except" -Block beendet wird. – ShadowRanger