HOWTO · Python
Como imprimir uma exceção em Python
Aprenda a imprimir uma exceção em Python, escolher entre uma mensagem e um traceback completo e evitar erros comuns no tratamento.
Nesta página
Use print(exception) quando precisar apenas da mensagem de erro. Use traceback.print_exc() dentro de um bloco except ativo quando precisar do traceback completo, incluindo o arquivo e a linha que causou o erro. Faça o tratamento por tipo específico e use logging em vez de print() para diagnósticos que precisam ser mantidos.
Imprimir a mensagem da exceção
Capture a exceção em uma variável e passe-a para print(). Esta é a maneira mais curta de mostrar o que deu errado:
try:
result = 10 / 0
except ZeroDivisionError as exc:
print("Could not calculate result:", exc)
Saída:
Could not calculate result: division by zero
O objeto da exceção é convertido no texto da mensagem. Este exemplo captura especificamente ZeroDivisionError, reduzindo a chance de esconder um erro de programação não relacionado. Se vários erros exigirem o mesmo tratamento, liste seus tipos em uma tupla, como except (TypeError, ValueError) as exc:.
Imprimir o traceback completo
A mensagem pode não mostrar onde o erro se originou. Importe o módulo integrado traceback do Python e chame print_exc() enquanto o manipulador estiver ativo:
import traceback
try:
values = [1, 2]
value = values[3]
except IndexError:
traceback.print_exc()
A saída inclui o tipo da exceção, a mensagem, o arquivo e a linha que falhou. Um traceback é mais útil que uma mensagem quando a exceção vem de várias chamadas de função aninhadas.
print_exc() lê a exceção que está sendo tratada. Chamá-lo depois que o bloco except terminou, ou sem uma exceção ativa, não recupera um traceback anterior; ele pode imprimir NoneType: None. Mantenha a chamada no manipulador ou salve a exceção e use print_exception() para ter controle explícito.
Controlar explicitamente a formatação do traceback
traceback.print_exception() aceita um objeto de exceção e pode escrever em um fluxo escolhido. Isso é útil quando a exceção precisa ser formatada ou redirecionada:
import sys
import traceback
try:
int("not a number")
except ValueError as exc:
traceback.print_exception(exc, file=sys.stdout)
Para criar texto em vez de imprimi-lo imediatamente, use traceback.format_exception(exc):
import traceback
try:
raise RuntimeError("configuration is missing")
except RuntimeError as exc:
formatted = "".join(traceback.format_exception(exc))
print(formatted)
As funções de traceback preservam o encadeamento de exceções por padrão. Assim, uma cadeia raise ... from ... pode mostrar a exceção original e a nova. Limite o traceback ou desative o encadeamento somente quando o contrato de saída exigir; remover o contexto dificulta o diagnóstico.
Exceções personalizadas e logging
Defina uma exceção personalizada quando os chamadores precisarem distinguir uma falha do domínio de um erro integrado. Capture esse tipo e imprima sua mensagem da mesma forma:
class ConfigurationError(Exception):
pass
try:
raise ConfigurationError("API key is missing")
except ConfigurationError as exc:
print("Configuration failed:", exc)
Em uma aplicação ou serviço, prefira logging.exception() dentro do manipulador. Ele registra a mensagem e o traceback ativo, e os manipuladores de log podem enviá-los para um arquivo ou para o monitoramento:
import logging
try:
load_settings()
except Exception:
logging.exception("Loading settings failed")
Substitua load_settings() pela operação que pode falhar. O exemplo captura Exception de forma ampla de propósito em um limite de logging; a lógica normal deve capturar os tipos específicos que realmente consegue tratar.
Erros comuns e perguntas frequentes
- Um
except:sem tipo também capturaKeyboardInterrupteSystemExit. Evite-o, a menos que exista um motivo específico para tratar subclasses deBaseException. - Não imprima apenas uma mensagem genérica e continue em silêncio quando o programa não puder produzir um resultado válido. Relance a exceção ou retorne uma falha explícita.
type(exc)mostra a classe concreta,str(exc)mostra a mensagem legível erepr(exc)pode revelar uma representação mais diagnóstica.- Se a saída for para um log, use
logging.exception()dentro do manipulador. Para um diagnóstico interativo curto,print(exc)é suficiente. traceback.print_exc()é para a exceção tratada no momento;traceback.print_exception(exc)é mais claro quando você guarda o objeto e precisa controlar formato ou saída.
Esses padrões usam o mecanismo de exceções integrado do Python e não exigem pacotes de terceiros. A escolha depende de você precisar de uma mensagem, do caminho completo das chamadas, de texto formatado ou de um log durável da aplicação.