Como posso escrever um bloco try
/ except
que captura todas as exceções?
sys.stderr
e possivelmente registradas. Essa é uma exceção perfeitamente válida e comum.
try: whatever() except Exception as e: exp_capture()
:?
Como posso escrever um bloco try
/ except
que captura todas as exceções?
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:
try:
do_something()
except:
print "Caught it!"
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 :
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
except ValueError:
print "Could not convert data to an integer."
except:
print "Unexpected error:", sys.exc_info()[0]
raise
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 capturar Exception
:
import traceback
import logging
try:
whatever()
except Exception as e:
logging.error(traceback.format_exc())
# Logs the error appropriately.
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 nu except
é que há algumas exceções que ele não vai pegar, mais obviamente KeyboardInterrupt
e SystemExit
: se você pegou e engoliu os então você poderia torná-lo difícil para qualquer um sair do seu script.
Exception
. Observe que é impossível gerar uma int
exceção e tentar fazer isso gera uma TypeError
exceção, que é o que seria detectado pela except 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 subclasse Exception
- isso será capturado por uma except
cláusula simples , mas não por uma except 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
try:
a = 2/0
except Exception as e:
print e.__doc__
print e.message
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
try:
something()
except BaseException as error:
print('An exception occurred: {}'.format(error))
Mas, como outras pessoas mencionaram, você normalmente não precisaria disso, apenas para casos específicos.
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."'.
try:
print "Performing an action which may throw an exception."
except Exception, error:
print "An exception was thrown!"
print str(error)
else:
print "Everything looks great!"
finally:
print "Finally is called directly after executing the try statement whether an exception is thrown or not."
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!
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:
def bad_method():
try:
sqrt = 0**-1
except Exception as e:
print(e)
bad_method()
Abordagem 2
Essa abordagem é recomendada porque fornece mais detalhes sobre cada exceção. Inclui:
A única desvantagem é que o tracback precisa ser importado.
import traceback
def bad_method():
try:
sqrt = 0**-1
except Exception:
print(traceback.print_exc())
bad_method()
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.
try:
raise IndexError #as test error
except Exception as e:
excepName = type(e).__name__ # returns the name of the exception
try:
whatever()
except:
# this will catch any exception or error
Vale ressaltar que isso não é uma codificação Python adequada. Isso também detectará muitos erros que você pode não querer detectar.