Como imprimir uma exceção em Python?

Respostas:

1062

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)
jldupont
fonte
41
str( KeyError('bad'))=> 'bad'- não informa tipo de exceção
Dave
10
print (e) nos espelhos-chave parece fornecer apenas a chave, mas não a mensagem de exceção completa, que é menos que útil.
Veggiet 10/02/19
14
Se você deseja imprimir a exceção, é melhor usar print(repr(e)); a Exception.__str__implementação base retorna apenas a mensagem de exceção, não o tipo. Ou use o tracebackmódulo, que possui métodos para imprimir a exceção atual, formatada ou o rastreamento completo.
Martijn Pieters
453

O tracebackmó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
Cat Plus Plus
fonte
4
existe algum tipo de chamada get_error_message que eu posso imprimir, visto que estou usando minha própria rotina de impressão para adicionar outras coisas.
27418 MikeSchem
11
@MikeSchem error_message = traceback.format_exc()
heyzling
3
Obrigado, este é o que eu queria. Traço todo, não apenas o tipo de erro e mensagem
Ken Bellows
Este snippet não usa o objeto de exceção capturado. Você pode expandir o código para usar 'ex'? - como em except Exception as ex:...
aaronsteers 19/08/19
@aaronsteers usa a exceção capturada; em um manipulador de exceções, a exceção atual está disponível por meio da 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.
Martijn Pieters
169

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
ilya n.
fonte
15
Em python3, deve-se usar a 1ª via, com "como".
Sam Watkins
53

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
Nick Dandoulakis
fonte
38

(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.stdoutpadrã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 sysisso funcionar.) Dessa forma, o erro é impresso em STDERRvez 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 tracebackmódulo como na resposta do Cat Plus Plus, e talvez seja o melhor caminho, mas pensei em lançar isso lá fora.

grish
fonte
1
Eu sugeriria adicionar mais flush = True. Eu notei com o systemd (e não usando uma estrutura de log adequada) que o armazenamento em buffer ao capturar no diário não é o que eu esperava.
Cameron Kerr #
20

Python 3: logging

Em vez de usar a print()função básica , o loggingmódulo mais flexível pode ser usado para registrar a exceção. O loggingmó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 loggingmódulo não deve ser usado dentro de um manipulador de log para evitar um RecursionError(obrigado @PrakharPandey)


Níveis de log alternativos

Também é possível registrar a exceção com outro nível de log usando o argumento de palavra-chave da seguinte exc_info=Truemaneira:

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)
winklerrr
fonte
1
Não deve ser usado dentro de um manipulador de log para evitar RecursionError
Prakhar Pandey 24/01
4

Um aumento de erro de liner pode ser feito com instruções assert, se é isso que você deseja fazer. Isso ajudará você a escrever código estaticamente corrigível e a verificar erros com antecedência.

assert type(A) is type(""), "requires a string"
whatnick
fonte
2

É 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'

Imprimir / Registrar o rastreamento completo

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'

Nome / mensagem do erro de impressão / registro apenas

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'
GinTonic
fonte