Python prova ... tranne virgola vs 'as' in tranne


246

Qual è la differenza tra ',' e 'as' nelle istruzioni tranne, ad esempio:

try:
    pass
except Exception, exception:
    pass

e:

try:
    pass
except Exception as exception:
    pass

La seconda sintassi è legale in 2.6? Funziona in CPython 2.6 su Windows ma l'interprete 2.5 in cygwin si lamenta che non è valido.

Se sono entrambi validi in 2.6 quale dovrei usare?

Risposte:


284

Il documento definitivo è PEP-3110: Catching Exceptions

Sommario:

  • In Python 3.x, asè necessario utilizzare per assegnare un'eccezione a una variabile.
  • In Python 2.6+, usa la assintassi, poiché è molto meno ambigua e compatibile con Python 3.x.
  • In Python 2.5 e precedenti, usa la versione virgola, poiché asnon è supportata.

16
L'utilizzo asè l'unico modo per assegnare l'eccezione a un locale in Python 3.x. Ma asnon è necessario , poiché non è necessario specificarlo se non è necessario.
mercatore,

38

Sì, è legale. Sto eseguendo Python 2.6

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

>>> 
woo hoo

Aggiornamento : c'è un altro motivo per usare la assintassi. L'uso ,rende le cose molto più ambigue, come altri hanno sottolineato; ed ecco cosa fa la differenza. A partire da Python 2.6, esiste un metodo multicatchche consente di catturare più eccezioni in un exceptblocco . In una situazione del genere, è più espressivo e pitonico da dire

except (exception1, exception2) as e

piuttosto che dire

except (exception1, exception2), e

che funzionerebbe ancora


13
Le versioni Python precedenti alla 2.6 ti consentivano di usare una tupla per catturare anche più tipi di eccezioni. Ma la sintassi era confusa; useresti except NameError, ValueError:quindi ti chiedi perché l' ValueErroreccezione non sia mai stata colta. O usato except (NameError, e):e sono stati lasciati con un NameErrorfor 'e'!
Martijn Pieters

17

la sintassi "as" è quella preferita in futuro, tuttavia se il codice deve funzionare con le versioni precedenti di Python (la 2.6 è la prima a supportare quella nuova), sarà necessario utilizzare la sintassi della virgola.


9

Se vuoi supportare tutte le versioni di Python puoi usare la sys.exc_info()funzione in questo modo:

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

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


2
Nota: ci sono alcuni casi angolari da tenere presente. In Py3, il astarget (insieme al resto delle informazioni sull'eccezione ) viene implicitamente modificato delnon appena si esce dal exceptblocco (questo impedisce ad alcuni riferimenti ciclici coinvolti nel traceback memorizzato di ritardare il rilascio della memoria fino a quando il GC ciclico non si avvia all'esecuzione ). Quindi questo codice equivalente è leggermente meno equivalente, a meno che non si usi un try/finallyall'interno del exceptblocco per assicurarsi che del evenga eseguito prima di uscire dal exceptblocco.
ShadowRanger,

0

A partire da Python 3.7 (non sono sicuro di altre versioni) la sintassi 'virgola' non è più supportata:

File sorgente 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.