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 captura KeyboardInterrupt e SystemExit. Evite-o, a menos que exista um motivo específico para tratar subclasses de BaseException.
  • 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 e repr(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.