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)

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

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

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

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.


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)

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"

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'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.