Quelle est la différence entre ',' et 'as' dans les instructions except, 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? Il fonctionne dans CPython 2.6 sur Windows mais l'interpréteur 2.5 dans cygwin se plaint qu'il n'est pas valide.
S'ils sont tous les deux valides en 2.6, que dois-je utiliser?
python
python-2.6
Peter Graham
la source
la source
as
est le seul moyen d'attribuer l'exception à un local dans Python 3.x. Mais ceas
n'est pas obligatoire , puisque vous n'avez pas à le spécifier si vous n'en avez pas du tout besoin.Oui c'est légal. J'utilise Python 2.6
Mise à jour : il existe une autre raison d'utiliser la
as
syntaxe. L'utilisation,
rend les choses beaucoup plus ambiguës, comme d'autres l'ont souligné; et voici ce qui fait la différence. Depuis Python 2.6, il y en amulticatch
qui vous permet de capturer plusieurs exceptions dans un seulexcept
bloc . Dans une telle situation, c'est plus expressif et pythonique de direplutôt que de dire
qui fonctionnerait toujours
la source
except NameError, ValueError:
alors demandé pourquoi l'ValueError
exception n'a jamais été interceptée. Ou utiliséexcept (NameError, e):
et se sont retrouvés avec unNameError
pour'e'
!la syntaxe "as" est la syntaxe préférée à l'avenir, cependant si votre code doit fonctionner avec des versions Python plus anciennes (2.6 est la première à prendre en charge la nouvelle), vous devrez utiliser la syntaxe virgule.
la source
Si vous souhaitez prendre en charge toutes les versions de python, vous pouvez utiliser la
sys.exc_info()
fonction comme ceci:(source: http://python3porting.com/noconv.html )
la source
as
cible (ainsi que le reste des informations d'exception) est implicitement éditéedel
dès que vous quittez leexcept
bloc (cela empêche certaines références cycliques impliquées dans le traçage stocké de retarder la libération de la mémoire jusqu'à ce que le GC cyclique se mette à fonctionner) ). Donc, ce code équivalent est légèrement moins équivalent, sauf si vous utilisez untry/finally
dans leexcept
bloc pour vous assurer qu'ildel e
est effectué avant de quitter leexcept
bloc.Depuis Python 3.7 (pas sûr des autres versions) la syntaxe 'virgule' n'est plus supportée:
Fichier source
exception_comma.py
:$ python --version --> Python 2.7.10
$ python3 --version --> Python 3.7.2
la source