2012-07-01 18 views
24

Voglio mantenere & utilizzare il valore di errore di un'eccezione in entrambi Python 2.5, 2.7 e 3.2.provare ... tranne ... come errore in Python 2.5 - Python 3.x

In Python 2.5 e 2.7 (ma non 3.x), questo funziona:

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

In Python 2.7 e 3.2 (ma non in 2.5), questo funziona:

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

Is esiste un codice per questo scopo che funzioni in entrambi 2.5, 2.7 e 3.2?

Grazie

+0

si fa a non aggiornare il vostro 2.5 codice per almeno 2,7 e preferibilmente 3? – Ben

+0

'except (ZeroDivisionError) come errore:' funziona bene in python 2.7 http://ideone.com/KfHBs –

+2

Python 3 non è espressamente compatibile all'indietro. Perché limitarti a un sottoinsieme limitato di sintassi supportato da entrambe le lingue? – Cameron

risposta

36

È possibile utilizzare una base di codice in Python 2.5 con 3.2, ma non è facile. Puoi dare un'occhiata a coverage.py, che funziona dal 2.3 al 3.3 con un unico codice base.

Il modo per intercettare un'eccezione e ottenere un riferimento all'eccezione che funziona in tutti loro è questo:

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

Ciò equivale a:

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

che funziona! Grazie! – user1492917

+1

Certo che funziona, ma forse la cura è peggiore (più brutta) del problema. Un altro modo sarebbe utilizzare "come" e uno script di conversione del codice quando il codice di imballaggio per 2.5. YMMV. –

+0

Il problema è che Python apporta modifiche significative e inutili alla sua sintassi tra le versioni. Immagina questo in C: dalla versione x.y usi "@" invece di "{" :) Questo è semplicemente stupido e la cura è molto meglio - dopotutto tutti noi vogliamo che funzioni! – Terminus

Problemi correlati