Respostas:
Para Python 2.6 e posterior e Python 3.x:
except Exception as e: print(e)
Para Python 2.5 e versões anteriores, use:
except Exception,e: print str(e)
str( KeyError('bad'))
=> 'bad'
- não informa tipo de exceção
print(repr(e))
; a Exception.__str__
implementação base retorna apenas a mensagem de exceção, não o tipo. Ou use o traceback
módulo, que possui métodos para imprimir a exceção atual, formatada ou o rastreamento completo.
O traceback
módulo fornece métodos para formatar e imprimir exceções e seus rastreios, por exemplo, isso imprimiria exceção como o manipulador padrão:
import traceback
try:
1/0
except Exception:
traceback.print_exc()
Resultado:
Traceback (most recent call last):
File "C:\scripts\divide_by_zero.py", line 4, in <module>
1/0
ZeroDivisionError: division by zero
error_message = traceback.format_exc()
except Exception as ex:
...
sys.exc_info()
função e a traceback.print_exc()
função obtém a partir daí. Você só precisará transmitir uma exceção explicitamente quando não estiver lidando com uma exceção ou quando desejar mostrar informações com base em uma exceção diferente.
No Python 2.6 ou superior , é um pouco mais limpo:
except Exception as e: print(e)
Nas versões mais antigas, ainda é bastante legível:
except Exception, e: print e
Caso você deseje transmitir cadeias de erro, aqui está um exemplo de Erros e Exceções (Python 2.6)
>>> try:
... raise Exception('spam', 'eggs')
... except Exception as inst:
... print type(inst) # the exception instance
... print inst.args # arguments stored in .args
... print inst # __str__ allows args to printed directly
... x, y = inst # __getitem__ allows args to be unpacked directly
... print 'x =', x
... print 'y =', y
...
<type 'exceptions.Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs
(Eu deixaria isso como um comentário na resposta de @ jldupont, mas não tenho reputação suficiente.)
Eu já vi respostas como a resposta da @ jldupont em outros lugares também. FWIW, acho importante notar que isso:
except Exception as e:
print(e)
imprimirá a saída de erro como sys.stdout
padrão. Uma abordagem mais apropriada para o tratamento de erros em geral seria:
except Exception as e:
print(e, file=sys.stderr)
(Observe que você precisa fazer import sys
isso funcionar.) Dessa forma, o erro é impresso em STDERR
vez deSTDOUT
, o que permite a saída / análise / redirecionamento adequados / etc. Entendo que a pergunta era estritamente sobre 'imprimir um erro', mas parece importante apontar as melhores práticas aqui, em vez de deixar de fora esses detalhes que podem levar a códigos não padronizados para quem eventualmente não aprender melhor.
Não usei o traceback
módulo como na resposta do Cat Plus Plus, e talvez seja o melhor caminho, mas pensei em lançar isso lá fora.
logging
Em vez de usar a print()
função básica , o logging
módulo mais flexível pode ser usado para registrar a exceção. O logging
módulo oferece muitas funcionalidades extras, por exemplo, registrando mensagens em um determinado arquivo de log, registrando mensagens com registros de data e hora e informações adicionais sobre onde o log ocorreu. (Para mais informações, consulte a documentação oficial .)
O registro de uma exceção pode ser feito com a função no nível do módulo, da seguinte logging.exception()
maneira:
import logging
try:
1/0
except BaseException:
logging.exception("An exception was thrown!")
Resultado:
ERROR:root:An exception was thrown!
Traceback (most recent call last):
File ".../Desktop/test.py", line 4, in <module>
1/0
ZeroDivisionError: division by zero
Notas:
a função logging.exception()
deve ser chamada apenas de um manipulador de exceções
o logging
módulo não deve ser usado dentro de um manipulador de log para evitar um RecursionError
(obrigado @PrakharPandey)
Também é possível registrar a exceção com outro nível de log usando o argumento de palavra-chave da seguinte exc_info=True
maneira:
logging.debug("An exception was thrown!", exc_info=True)
logging.info("An exception was thrown!", exc_info=True)
logging.warning("An exception was thrown!", exc_info=True)
É possível controlar praticamente quais informações do traceback serão exibidas / registradas ao capturar exceções.
O código
with open("not_existing_file.txt", 'r') as text:
pass
produziria o seguinte rastreamento:
Traceback (most recent call last):
File "exception_checks.py", line 19, in <module>
with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'
Como já mencionado, você pode capturar todo o traceback usando o módulo traceback:
import traceback
try:
with open("not_existing_file.txt", 'r') as text:
pass
except Exception as exception:
traceback.print_exc()
Isso produzirá a seguinte saída:
Traceback (most recent call last):
File "exception_checks.py", line 19, in <module>
with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'
Você pode conseguir o mesmo usando o log:
try:
with open("not_existing_file.txt", 'r') as text:
pass
except Exception as exception:
logger.error(exception, exc_info=True)
Resultado:
__main__: 2020-05-27 12:10:47-ERROR- [Errno 2] No such file or directory: 'not_existing_file.txt'
Traceback (most recent call last):
File "exception_checks.py", line 27, in <module>
with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'
Você pode não estar interessado em todo o rastreamento, mas apenas nas informações mais importantes, como Nome da exceção e Mensagem de exceção, use:
try:
with open("not_existing_file.txt", 'r') as text:
pass
except Exception as exception:
print("Exception: {}".format(type(exception).__name__))
print("Exception message: {}".format(exception))
Resultado:
Exception: FileNotFoundError
Exception message: [Errno 2] No such file or directory: 'not_existing_file.txt'