2010-03-29 14 views
202

¿Cuál es la diferencia entre '', y 'como' en declaraciones a excepción, por ejemplo:Python tratar ... excepto por comas vs 'como' en la excepción

try: 
    pass 
except Exception, exception: 
    pass 

y:

try: 
    pass 
except Exception as exception: 
    pass 

¿La segunda sintaxis es legal 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?

Respuesta

229

El documento definitivo es PEP-3110: Catching Exceptions

Resumen:

  • En Python 3.x, utilizando ases necesaria para asignar una excepción a una variable.
  • En Python 2.6+, use la sintaxis as, ya que es mucho menos ambigua y es compatible con versiones anteriores de Python 3.x.
  • En Python 2.5 y versiones anteriores, use la versión de coma, ya que as no es compatible.
+12

El uso de 'as' es la única forma de asignar la excepción a un local en Python 3.x. Pero 'as' no es _required_, ya que no tiene que especificarlo si no lo necesita en absoluto. – mercator

17

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

33

Sí, es legal. Estoy corriendo Python 2,6

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

>>> 
woo hoo 

actualización: Hay otra razón para utilizar la sintaxis as. Usar , hace las cosas mucho más ambiguas, como otros han señalado; y aquí está lo que hace la diferencia. A partir de Python 2.6, hay multicatch que le permite catch multiple exceptions in one except block. En tal situación, es más expresivo y Pythonic decir

except (exception1, exception2) as e 

en lugar de decir

except (exception1, exception2), e 

que siguen trabajando

+13

Las versiones de Python * antes * 2.6 le permitieron usar una tupla para capturar múltiples tipos de excepción también. Pero la sintaxis era confusa; usted usaría 'excepto NameError, ValueError:' y luego se preguntaría por qué la excepción 'ValueError' nunca fue capturada. O usó 'except (NameError, e):' y se les dejó un 'NameError' para''e''! –

7

Si quieres apoyar a todas las versiones de Python que puede utilizar el función sys.exc_info() como esto:

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

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

+1

Nota: hay algunos casos de esquina que debes tener en cuenta.En Py3, el objetivo 'as' (junto con el resto de la información de la excepción) se' implícitamente 'al salir del bloque 'except' (esto impide que algunas referencias cíclicas involucradas en el rastreo almacenado retrasen el lanzamiento de memoria hasta que el GC cíclico se pone en funcionamiento). Por lo tanto, este código equivalente es ligeramente menos equivalente, a menos que use un 'try/finally' dentro del bloque' except' para asegurarse de que 'del e' se ejecute antes de salir del bloque' except'. – ShadowRanger

Cuestiones relacionadas