Prueba de Python ... excepto coma vs 'como' en excepto

246

¿Cuál es la diferencia entre ',' y 'como' en las declaraciones de excepción, por ejemplo:

try:
    pass
except Exception, exception:
    pass

y:

try:
    pass
except Exception as exception:
    pass

¿Es legal la segunda sintaxis en 2.6? Funciona en CPython 2.6 en Windows, pero el intérprete 2.5 en cygwin se queja de que no es válido.

Si ambos son válidos en 2.6, ¿qué debo usar?

Peter Graham
fuente

Respuestas:

284

El documento definitivo es PEP-3110: Excepciones de captura

Resumen:

  • En Python 3.x, asse requiere el uso para asignar una excepción a una variable.
  • En Python 2.6+, use la assintaxis, ya que es mucho menos ambigua y compatible con Python 3.x.
  • En Python 2.5 y versiones anteriores, use la versión de coma, ya asque no es compatible.
Ámbar
fuente
16
Usar ases la única forma de asignar la excepción a un local en Python 3.x. Pero asno es obligatorio , ya que no tiene que especificarlo si no lo necesita en absoluto.
mercator
38

Si es legal. Estoy ejecutando Python 2.6

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

>>> 
woo hoo

Actualización : hay otra razón para usar la assintaxis. El uso ,hace que las cosas sean mucho más ambiguas, como han señalado otros; y esto es lo que hace la diferencia. A partir de Python 2.6, existe una multicatchque le permite capturar múltiples excepciones en un exceptbloque . En tal situación, es más expresivo y pitónico decir

except (exception1, exception2) as e

en lugar de decir

except (exception1, exception2), e

que todavía funcionaría

inspectorG4dget
fuente
13
Las versiones de Python anteriores a 2.6 también le permitieron usar una tupla para capturar múltiples tipos de excepción. Pero la sintaxis era confusa; usarías y except NameError, ValueError:luego te preguntarías por qué ValueErrornunca se detectó la excepción. O usado except (NameError, e):y se quedaron con un NameErrorpara 'e'!
Martijn Pieters
17

la sintaxis "as" es la preferida en el futuro, sin embargo, si su código necesita funcionar con versiones anteriores de Python (2.6 es la primera en admitir la nueva), deberá usar la sintaxis de coma.

Alex Gaynor
fuente
9

Si desea admitir todas las versiones de Python, puede usar la sys.exc_info()función de esta manera:

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

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

pthomaid
fuente
2
Nota: Hay algunos casos de esquina aquí para tener en cuenta. En Py3, el asobjetivo (junto con el resto de la información de excepción) se edita implícitamente deltan pronto como salga del exceptbloque (esto evita que algunas referencias cíclicas involucradas en el rastreo almacenado retrasen la liberación de memoria hasta que el GC cíclico comience a funcionar ) Por lo tanto, este código equivalente es ligeramente menos equivalente, a menos que use un try/finallydentro del exceptbloque para asegurarse de que del ese realice antes de salir del exceptbloque.
ShadowRanger
0

A partir de Python 3.7 (no estoy seguro acerca de otras versiones), la sintaxis 'coma' ya no es compatible:

Archivo fuente 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
fuente