web-dev-qa-db-fra.com

Python essayez ... sauf la virgule vs 'as' dans sauf

Quelle est la différence entre ',' et 'comme' dans les énoncés sauf, par exemple:

try:
    pass
except Exception, exception:
    pass

et:

try:
    pass
except Exception as exception:
    pass

La deuxième syntaxe est-elle légale en 2.6? Cela fonctionne dans CPython 2.6 sur Windows mais l'interpréteur 2.5 de cygwin se plaint de son invalidité.

Si elles sont toutes deux valides en 2.6, que dois-je utiliser?

237
Peter Graham

Le document définitif est PEP-3110: Catching Exceptions

Sommaire:

  • Dans Python 3.x, utiliser as est nécessaire pour affecter une exception à une variable.
  • Dans Python 2.6+, utilisez la syntaxe as, car elle est beaucoup moins ambiguë et compatible en aval avec Python 3.x.
  • Dans Python 2.5 et versions antérieures, utilisez la version en virgule, car as n'est pas pris en charge.
274
Amber

Oui c'est légal. J'utilise Python 2.6

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

>>> 
woo hoo

Mise à jour : Il existe une autre raison d'utiliser la syntaxe as. En utilisant , rend les choses beaucoup plus ambiguës, comme l'ont souligné d'autres personnes; et voici ce qui fait la différence. A partir de Python 2.6, il existe multicatch qui vous permet de intercepter plusieurs exceptions dans un bloc except bloc . Dans une telle situation , c'est plus expressif et pythonique à dire

except (exception1, exception2) as e

plutôt que de dire

except (exception1, exception2), e

qui fonctionnerait encore

38
inspectorG4dget

la syntaxe "en tant que" est la syntaxe préférée à l'avenir, cependant si votre code doit fonctionner avec des versions plus anciennes Python (2.6 est la première à prendre en charge la nouvelle)), vous devrez alors utiliser la syntaxe par virgule.

17
Alex Gaynor

Si vous voulez supporter toutes les versions de python), vous pouvez utiliser la fonction sys.exc_info () comme ceci:

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

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

9
pthomaid

A partir de Python 3.7 (pas sûr des autres versions), la syntaxe 'virgule' n'est plus supportée:

Fichier source 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
0
Marcello Romani