2012-07-01 24 views
24

Quiero mantener & use el valor de error de una excepción en Python 2.5, 2.7 y 3.2.intente ... excepto ... como error en Python 2.5 - Python 3.x

En Python 2.5 y 2.7 (pero no 3.x), esto funciona:

try: 
    print(10 * (1/0)) 
except ZeroDivisionError, error:  # old skool 
    print("Yep, error caught:", error) 

En Python 2.7 y 3.2 (pero no en 2.5), esto funciona:

try: 
    print(10 * (1/0)) 
except (ZeroDivisionError) as error: # 'as' is needed by Python 3 
    print("Yep, error caught:", error) 

Es Hay algún código para este propósito que funcione tanto en 2.5, 2.7 y 3.2?

Gracias

+0

¿No puedes actualizar el 2,5 codificar al menos 2.7 y preferiblemente 3? – Ben

+0

'excepto (ZeroDivisionError) como error:' funciona bien en Python 2.7 http://ideone.com/KfHBs –

+2

Python 3 expresamente no es compatible con versiones anteriores. ¿Por qué restringirse a un subconjunto limitado de sintaxis compatible con ambos idiomas? – Cameron

Respuesta

36

Usted puede usar una base de código en pitones 2.5 a través de 3.2, pero no es fácil. Puede echar un vistazo a coverage.py, que se ejecuta en 2.3 hasta 3.3 con una única base de código.

La manera de capturar una excepción y obtener una referencia a la excepción de que funciona en todos ellos es la siguiente:

except ValueError: 
    _, err, _ = sys.exc_info() 
    #.. use err... 

Esto es equivalente a:

except ValueError as err: 
    #.. use err... 
+0

que funciona! ¡Gracias! – user1492917

+1

De acuerdo, funciona, pero tal vez la cura sea peor (más fea) que el problema. Otra forma sería usar "como" y una secuencia de comandos de conversión de código al empaquetar el código para 2.5. YMMV. –

+0

El problema es que Python realiza cambios significativos e innecesarios en su sintaxis entre versiones. Imagina esto en C: de la versión x.y usas "@" en lugar de "{" :). Esto es simplemente estúpido y la cura es mucho mejor, ¡después de todo, todos queremos que funcione! – Terminus