Tente Python ... exceto vírgula vs 'como' em exceto


246

Qual é a diferença entre ',' e 'as' nas declarações exceto, por exemplo:

try:
    pass
except Exception, exception:
    pass

e:

try:
    pass
except Exception as exception:
    pass

A segunda sintaxe é legal no 2.6? Funciona no CPython 2.6 no Windows, mas o intérprete 2.5 no cygwin reclama que é inválido.

Se ambos são válidos no 2.6, qual devo usar?

Respostas:


284

O documento definitivo é PEP-3110: captura de exceções

Resumo:

  • No Python 3.x, asé necessário usar para atribuir uma exceção a uma variável.
  • No Python 2.6 ou superior, use a assintaxe, pois é muito menos ambígua e compatível com o Python 3.x.
  • No Python 2.5 e versões anteriores, use a versão de vírgula, pois asnão há suporte.

16
Usar asé a única maneira de atribuir a exceção a um local no Python 3.x. Mas asnão é necessário , pois você não precisa especificá-lo, se não precisar.
Mercator

38

Sim, é legal. Estou executando o Python 2.6

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

>>> 
woo hoo

Atualização : Há outro motivo para usar a assintaxe. O uso ,torna as coisas muito mais ambíguas, como outros já apontaram; e aqui está o que faz a diferença. No Python 2.6, existe o multicatchque permite capturar várias exceções em um exceptbloco . Em tal situação, é mais expressivo e pitônico dizer

except (exception1, exception2) as e

ao invés de dizer

except (exception1, exception2), e

que ainda funcionaria


13
As versões do Python anteriores ao 2.6 permitiam que você usasse uma tupla para capturar vários tipos de exceção também. Mas a sintaxe era confusa; você usaria except NameError, ValueError:então se perguntaria por que a ValueErrorexceção nunca estava sendo capturada. Ou usado except (NameError, e):e foram deixados com um NameErrorpara 'e'!
Martijn Pieters

17

a sintaxe "as" é a preferida daqui para frente; no entanto, se seu código precisar trabalhar com versões mais antigas do Python (a 2.6 é a primeira a oferecer suporte à nova), será necessário usar a sintaxe da vírgula.


9

Se você deseja suportar todas as versões python, pode usar a sys.exc_info()função da seguinte maneira:

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

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


2
Nota: Existem alguns casos de canto aqui para estar ciente. No Py3, o asdestino (junto com o restante das informações da exceção) é implicitamente deleditado assim que você sai do exceptbloco (isso impede que algumas referências cíclicas envolvidas no traceback armazenado atrasem a liberação da memória até que o GC cíclico volte a funcionar ) Portanto, esse código equivalente é um pouco menos equivalente, a menos que você use um try/finallydentro do exceptbloco para garantir que del eseja executado antes de sair do exceptbloco.
ShadowRanger

0

A partir do Python 3.7 (não tenho certeza sobre outras versões), a sintaxe 'vírgula' não é mais suportada:

Arquivo de origem 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.