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?

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.

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


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.


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 )


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.