Creación de excepciones personalizadas en Python
Clase 12 de 25 • Curso de Python: Entornos virtuales, PEP8 y Manejo de Errores
Resumen
Domina el manejo de errores en Python creando excepciones personalizadas que expresen la intención de tu código y mejoren la experiencia de otros desarrolladores. Con raise, try, except y finally, podrás detener la ejecución a tiempo, comunicar fallos específicos y decidir dónde y cómo mostrarlos.
Excepciones personalizadas en Python
Crear tus propias excepciones te permite nombrar el problema y facilitar su captura precisa. En lugar de devolver una lista vacía, puedes lanzar un error explícito para que quien consuma la funcionalidad decida el mensaje a mostrar.
¿Cómo funciona raise para detener la ejecución?
- Usa raise para lanzar un error y frenar el flujo.
- El bloque finally se ejecuta siempre, incluso si hay error.
- Mensajes claros orientan al desarrollador: "no está permitido el cálculo por dos".
# Ejemplo inicial con la excepción genérica
def dividir(a, b):
if b == 2:
raise Exception("No está permitido el cálculo por dos")
return a / b
try:
dividir(100, 2)
except Exception as e:
print(e)
finally:
print("finally siempre se ejecuta")
¿Por qué crear una excepción específica y no usar Exception?
- Para capturar solo lo que importa y no "todo" con Exception.
- Para documentar la intención del error mediante nombre y docstring.
class DivisionError(Exception):
"""Error en operación."""
pass
def dividir(a, b):
if b == 2:
raise DivisionError("No está permitido el cálculo por dos")
return a / b
try:
dividir(100, 2)
except DivisionError as e: # captura específica
print(e)
finally:
print("finally siempre se ejecuta")
Patrón try, except y finally
El flujo de manejo de errores se apoya en cuatro cláusulas usadas con intención: colocar lo frágil en try, decidir cuándo fallar con raise, capturar con except y garantizar limpieza con finally.
¿Qué hace cada cláusula en el flujo de errores?
- try: bloque con código que podría fallar.
- raise: detiene la ejecución y lanza un tipo de error específico.
- except: captura un tipo de error concreto o todos si usas Exception.
- finally: se ejecuta siempre, ocurra o no un error.
¿Cómo capturar y mostrar mensajes claros?
- Captura el tipo correcto para evitar silencios o excesos.
- Muestra el mensaje de la excepción con print(e).
- Evita duplicar mensajes en consola.
try:
# operación sensible
resultado = dividir(100, 2)
except DivisionError as e:
print(e) # mensaje claro y suficiente
finally:
print("limpieza de recursos, si aplica")
Caso aplicado con News API client
En lugar de retornar arrays vacíos, lanza errores que expresen el fallo real. Define una jerarquía de excepciones para tu cliente y maneja los errores donde consumes la funcionalidad.
¿Cómo definir una jerarquía de excepciones para la app?
- Crea una base para agrupar errores de la aplicación.
- Hereda casos específicos como ApiKey inválida.
- Documenta con docstrings para guiar a otros.
class NewsSystemError(Exception):
"""Error general en la app."""
pass
class ApiKeyError(NewsSystemError):
"""ApiKey inválida."""
pass
# En el cliente, en lugar de devolver lista vacía
def fetch_articles():
# ... si falla la conexión con la API
raise NewsSystemError("Ocurrió un error, no se pudo conectar con la API")
¿Dónde y cómo manejar el error en el consumo?
- Maneja el error donde llamas al cliente, con try/except.
- Inicializa variables como response_data en None para evitar referencias no definidas.
- Muestra solo el mensaje de la excepción para evitar repeticiones.
response_data = None
try:
response_data = fetch_articles()
except NewsSystemError as e:
print(e) # "Ocurrió un error, no se pudo conectar con la API"
if response_data is not None:
# continuar con el flujo cuando hay datos válidos
pass
Ideas clave para aplicar hoy: - Excepciones personalizadas: nombres claros y captura específica. - raise: decide cuándo detener el flujo con un mensaje útil. - Jerarquía de errores: una base común más casos concretos. - Manejo en el consumidor: try/except cerca del uso real. - Estados seguros: inicializa a None y valida antes de usar.
¿Ya tienes una excepción personalizada para tu News API client? Compártela y cuéntanos cómo decidiste el nombre, el mensaje y dónde la capturas.