Os seguintes trechos de código fazem a mesma coisa. Eles capturam todas as exceções e executam o código no except:
bloco
Snippet 1 -
try:
#some code that may throw an exception
except:
#exception handling code
Snippet 2 -
try:
#some code that may throw an exception
except Exception as e:
#exception handling code
Qual é exatamente a diferença nas duas construções?
python
python-3.x
narendranathjoshi
fonte
fonte
except Exception, e:
eexcept Exception as e:
. Esta pergunta pergunta qual é a diferença entreexcept:
eexcept Exception as e:
.Respostas:
No segundo, você pode acessar os atributos do objeto de exceção:
Mas ele não pega
BaseException
ou as exceções de sair do sistemaSystemExit
,KeyboardInterrupt
eGeneratorExit
:Que um nu, exceto:
Consulte a seção Exceções internas dos documentos e a seção Erros e exceções do tutorial para obter mais informações.
fonte
Exception
é derivadoBaseException
, é por issoexcept Exception
que não pegaBaseException
. Se você escreverexcept BaseException
, também será capturado. Nuaexcept
apenas pega tudo.except
deve ser o último de uma série deexcept
blocos, enquanto você não receberá um erro se colocarexcept Exception
antes de outrosexcept
blocos: eles serão ignorados silenciosamente (se manipularemException
subclasses). Algo a observar.except
eexcept Exception
. "Algo a ser observado" parece um pouco estranho agora, mas na época eu esperava que o Python escolhesse oexcept
bloco mais específico , independentemente de onde estivesse, e fiquei um pouco decepcionado ao descobrir o contrário.aceita todas as exceções, enquanto
só aceita exceções que você deve capturar.
Aqui está um exemplo de um que você não deve pegar:
O primeiro silenciou o
KeyboardInterrupt
!Aqui está uma lista rápida:
Se você quiser pegar um desses, é melhor fazer
salientar que você sabe o que está fazendo.
Todas as exceções decorrem
BaseException
e as que você deve capturar no dia-a-dia (aquelas que serão lançadas para o programador) também herdamException
.fonte
except(Exception)
nunca pegaKeyboardInterrupt
erros.as e
não tem nada a ver com isso.as e
, porque presumi que é óbvio o que faz.SystemExit
ou queKeyboardInterrupt
possa escapar. Não é um caso comum, mas acontece.Existem diferenças com algumas exceções, por exemplo, KeyboardInterrupt.
Lendo PEP8 :
fonte
O uso do segundo formulário fornece uma variável (nomeada com base na
as
cláusula, no seu exemploe
) noexcept
escopo do bloco com o objeto de exceção vinculado a ele, para que você possa usar a informação na exceção (tipo, mensagem, rastreamento de pilha, etc.) para lidar com a exceção em uma mansão mais especialmente adaptada.fonte
Outra maneira de ver isso. Confira os detalhes da exceção:
Existem muitas "coisas" a serem acessadas usando a sintaxe 'as e'.
Esse código foi feito apenas para mostrar os detalhes dessa instância.
fonte