Python versuchen ... außer Komma vs 'wie' in außer

246

Was ist der Unterschied zwischen ',' und 'as' in Ausnahmen, z. B.:

try:
    pass
except Exception, exception:
    pass

und:

try:
    pass
except Exception as exception:
    pass

Ist die zweite Syntax in 2.6 zulässig? 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, welche soll ich verwenden?

Peter Graham
quelle

Antworten:

284

Das endgültige Dokument ist PEP-3110: Ausnahmen abfangen

Zusammenfassung:

  • In Python 3.x verwenden asist erforderlich , eine Ausnahme von einer Variablen zuzuweisen.
  • Verwenden Sie in Python 2.6+ die asSyntax, da diese weit weniger mehrdeutig und vorwärtskompatibel mit Python 3.x ist.
  • Verwenden Sie in Python 2.5 und früheren Versionen die Komma-Version, da diese asnicht unterstützt wird.
Bernstein
quelle
16
Die Verwendung asist die einzige Möglichkeit, die Ausnahme einem lokalen in Python 3.x zuzuweisen. Ist aber asnicht erforderlich , da Sie es nicht angeben müssen, wenn Sie es überhaupt nicht benötigen.
Mercator
38

Ja, es ist legal. Ich verwende Python 2.6

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

>>> 
woo hoo

Update : Es gibt noch einen weiteren Grund, die asSyntax zu verwenden. Das Verwenden ,macht die Dinge viel mehrdeutiger, wie andere betont haben; und hier ist, was den Unterschied macht. Ab Python 2.6 multicatchkönnen Sie mehrere Ausnahmen in einem exceptBlock abfangen . In einer solchen Situation ist es ausdrucksvoller und pythonischer zu sagen

except (exception1, exception2) as e

anstatt zu sagen

except (exception1, exception2), e

das würde noch funktionieren

inspectorG4dget
quelle
13
In Python-Versionen vor 2.6 konnten Sie ein Tupel verwenden, um auch mehrere Ausnahmetypen abzufangen. Aber die Syntax war verwirrend; Sie würden sich except NameError, ValueError:dann fragen, warum die ValueErrorAusnahme nie abgefangen wurde. Oder gebraucht except (NameError, e):und wurden mit einem NameErrorfür 'e'!
Martijn Pieters
17

Die "as" -Syntax ist in Zukunft die bevorzugte. Wenn Ihr Code jedoch mit älteren Python-Versionen funktionieren muss (2.6 unterstützt als erster die neue), müssen Sie die Kommasyntax verwenden.

Alex Gaynor
quelle
9

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

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

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

pthomaid
quelle
2
Hinweis: Hier sind einige Eckfälle zu beachten. In Py3 wird das asZiel (zusammen mit den restlichen Ausnahmeinformationen) implizit festgelegt, delsobald Sie den exceptBlock verlassen (dies verhindert, dass einige zyklische Referenzen, die am gespeicherten Traceback beteiligt sind, die Freigabe des Speichers verzögern, bis der zyklische GC ausgeführt wird ). Dieser äquivalente Code ist also etwas weniger äquivalent, es sei denn, Sie verwenden a try/finallyinnerhalb des exceptBlocks, um sicherzustellen, dass er ausgeführt del ewird, bevor Sie den exceptBlock verlassen.
ShadowRanger
0

Ab Python 3.7 (bei anderen Versionen nicht sicher) wird die Kommasyntax nicht mehr unterstützt:

Quelldatei exception_comma.py:

try:
    result = 1/0
except Exception, e:
    print("An error occurred")
    exit(1)

exit(0)
  • $ python --version --> Python 2.7.10
$ python exception_comma.py
An error occurred
  • $ python3 --version --> Python 3.7.2
$ python3 exception_comma.py
  File "exception_comma.py", line 3
    except Exception, e:
                    ^
SyntaxError: invalid syntax
Marcello Romani
quelle