HOWTO · Python
Cómo imprimir una excepción en Python
Aprenda a imprimir una excepción en Python, elegir entre un mensaje y un traceback completo y evitar errores comunes al manejar excepciones.
En esta página
Use print(exception) cuando solo necesite el mensaje de error. Use traceback.print_exc() dentro de un bloque except activo cuando necesite el traceback completo, incluidos el archivo y la línea que causó el error. Mantenga el manejo específico y use logging en lugar de print() para diagnósticos que deban conservarse.
Imprimir el mensaje de la excepción
Capture la excepción en una variable y pásela a print(). Esta es la forma más breve de mostrar qué salió mal:
try:
result = 10 / 0
except ZeroDivisionError as exc:
print("Could not calculate result:", exc)
Salida:
Could not calculate result: division by zero
El objeto de excepción se convierte en su texto de mensaje. Este ejemplo captura específicamente ZeroDivisionError, por lo que es menos probable que oculte un error de programación no relacionado. Si varios errores necesitan el mismo tratamiento, enumere sus tipos en una tupla, como except (TypeError, ValueError) as exc:.
Imprimir el traceback completo
El mensaje puede no mostrar dónde se originó el error. Importe el módulo integrado traceback de Python y llame a print_exc() mientras el controlador esté activo:
import traceback
try:
values = [1, 2]
value = values[3]
except IndexError:
traceback.print_exc()
La salida incluye el tipo de excepción, el mensaje, el archivo y la línea que falló. Un traceback es más útil que un mensaje cuando la excepción proviene de varias llamadas de función anidadas.
print_exc() lee la excepción que se está manejando. Llamarlo después de terminar el bloque except, o cuando no hay una excepción activa, no recupera un traceback anterior; puede imprimir NoneType: None. Mantenga la llamada en el controlador o guarde la excepción y use print_exception() para control explícito.
Controlar explícitamente el formato del traceback
traceback.print_exception() acepta un objeto de excepción y puede escribir en un flujo elegido. Esto resulta útil cuando la excepción debe formatearse o redirigirse:
import sys
import traceback
try:
int("not a number")
except ValueError as exc:
traceback.print_exception(exc, file=sys.stdout)
Para crear texto en vez de imprimirlo de inmediato, 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)
Las funciones de traceback conservan por defecto el encadenamiento de excepciones. Por eso una cadena raise ... from ... puede mostrar tanto la excepción original como la nueva. Limite el traceback o desactive el encadenamiento solo si el contrato de salida lo exige; eliminar el contexto dificulta el diagnóstico.
Excepciones personalizadas y registro
Defina una excepción personalizada cuando los llamadores deban distinguir un fallo del dominio de un error integrado. Capture ese tipo e imprima su mensaje de la misma manera:
class ConfigurationError(Exception):
pass
try:
raise ConfigurationError("API key is missing")
except ConfigurationError as exc:
print("Configuration failed:", exc)
En una aplicación o servicio, prefiera logging.exception() dentro del controlador. Registra el mensaje y el traceback activo, y los controladores de registro pueden enviarlos a un archivo o a la supervisión:
import logging
try:
load_settings()
except Exception:
logging.exception("Loading settings failed")
Reemplace load_settings() por la operación que puede fallar. El ejemplo muestra intencionadamente una captura amplia de Exception en un límite de registro; la lógica normal debe capturar los tipos concretos que realmente puede manejar.
Errores comunes y preguntas frecuentes
- Un
except:sin tipo también capturaKeyboardInterruptySystemExit. Evítelo salvo que tenga un motivo específico para manejar subclases deBaseException. - No imprima solo un mensaje genérico y continúe en silencio cuando el programa no pueda producir un resultado válido. Vuelva a lanzar la excepción o devuelva un fallo explícito.
type(exc)muestra la clase concreta,str(exc)el mensaje legible yrepr(exc)puede mostrar una representación más diagnóstica.- Si la salida va a un registro, use
logging.exception()dentro del controlador. Si solo necesita un diagnóstico interactivo breve, basta conprint(exc). traceback.print_exc()es para la excepción que se está manejando;traceback.print_exception(exc)es más claro cuando conserva el objeto y necesita controlar el formato o la salida.
Estos patrones usan el mecanismo de excepciones integrado de Python y no requieren paquetes de terceros. La elección correcta depende de si necesita un mensaje, la ruta completa de llamadas, texto formateado o un registro duradero de la aplicación.