Como posso escrever um bloco try
/ except
que captura todas as exceções?
python
exception-handling
user469652
fonte
fonte
sys.stderr
e possivelmente registradas. Essa é uma exceção perfeitamente válida e comum.try: whatever() except Exception as e: exp_capture()
:?Respostas:
Você pode, mas provavelmente não deveria:
No entanto, isso também trará exceções
KeyboardInterrupt
e você geralmente não quer isso, não é? A menos que você apresente a exceção imediatamente, consulte o seguinte exemplo nos documentos :fonte
except Exception:
o que está nu, exceto se você tiver lá também capturar os que são da BaseException.Além de uma
except:
cláusula simples (que, como outros já disseram que você não deve usar), você pode simplesmente capturarException
:Normalmente, você só consideraria fazer isso no nível mais externo do seu código se, por exemplo, quisesse lidar com exceções não capturadas antes de terminar.
A vantagem
except Exception
sobre o nuexcept
é que há algumas exceções que ele não vai pegar, mais obviamenteKeyboardInterrupt
eSystemExit
: se você pegou e engoliu os então você poderia torná-lo difícil para qualquer um sair do seu script.fonte
Exception
. Observe que é impossível gerar umaint
exceção e tentar fazer isso gera umaTypeError
exceção, que é o que seria detectado pelaexcept Exception
cláusula anexa nesse caso. Por outro lado, uma classe de estilo antigo pode ser gerada e qualificada como uma "não exceção" que não subclasseException
- isso será capturado por umaexcept
cláusula simples , mas não por umaexcept Exception
cláusula.TypeError
sys.exit()
normalmente significa que você espera que o aplicativo seja encerrado, mas se você pegar o SystemExit, ele não será. Da mesma forma, se você pressionar Control-C em um script em execução (Ctrl-break no Windows), espera que o programa pare, para não pegar o erro e continuar. Mas você pode capturar um ou ambos, se quiser fazer a limpeza antes de existir.Você pode fazer isso para lidar com exceções gerais
fonte
Para capturar todas as exceções possíveis, pegue
BaseException
. Está no topo da hierarquia de exceção:Python 3: https://docs.python.org/3.5/library/exceptions.html#exception-hierarchy
Python 2.7: https://docs.python.org/2.7/library/exceptions.html#exception-hierarchy
Mas, como outras pessoas mencionaram, você normalmente não precisaria disso, apenas para casos específicos.
fonte
Exemplo muito simples, semelhante ao encontrado aqui:
http://docs.python.org/tutorial/errors.html#defining-clean-up-actions
Se você estiver tentando capturar TODAS as exceções, coloque todo o seu código na instrução "try:", no lugar de 'print "Executando uma ação que pode gerar uma exceção."'.
No exemplo acima, você veria a saída nesta ordem:
1) Realizando uma ação que pode gerar uma exceção.
2) Finalmente, é chamado diretamente após a execução da instrução try, independentemente de uma exceção ser lançada ou não.
3) "Uma exceção foi lançada!" ou "Tudo parece ótimo!" dependendo se uma exceção foi lançada.
Espero que isto ajude!
fonte
Existem várias maneiras de fazer isso, em particular no Python 3.0 e superior.
Abordagem 1
Essa é uma abordagem simples, mas não recomendada, porque você não saberia exatamente qual linha de código está lançando a exceção:
Abordagem 2
Essa abordagem é recomendada porque fornece mais detalhes sobre cada exceção. Inclui:
A única desvantagem é que o tracback precisa ser importado.
fonte
Acabei de descobrir esse pequeno truque para testar nomes de exceção no Python 2.7. Às vezes, eu lidei com exceções específicas no código, então eu precisava de um teste para ver se esse nome está dentro de uma lista de exceções manipuladas.
fonte
Vale ressaltar que isso não é uma codificação Python adequada. Isso também detectará muitos erros que você pode não querer detectar.
fonte