Jerarquía de errores en Python: try, except y finally

Clase 45 de 49Curso Práctico de Python: Creación de un CRUD

Resumen

El manejo de errores en Python es clave para evitar que un programa termine de forma anticipada y para diseñar flujos de control robustos. Aquí aprenderás a usar la jerarquía de excepciones, a lanzar y capturar errores con intención, y a aplicar buenas prácticas que mejoran la calidad del código.

¿Por qué el manejo de errores en Python evita que tu programa termine?

Los errores en tiempo de ejecución son distintos a los de sintaxis: si hay un error de sintaxis, el programa ni siquiera corre. En cambio, con sintaxis correcta aún puedes fallar si ocurre una excepción en ejecución. Por eso, lanzar y capturar errores con una estrategia clara es esencial.

  • Excepciones vs. sintaxis: las excepciones ocurren en ejecución, la sintaxis se valida antes de correr.
  • Lanzar errores: se habla de throw y en Python se usa el keyword para “aventar un error”.
  • Jerarquía rica: todo parte de BaseException, lo que permite extender y crear errores propios.
  • Riesgo principal: si no manejas la excepción, el programa termina.

¿Cómo usar try, except, else y finally con estrategia?

La captura indiscriminada no es solución. Python promueve bloques try y except para modelar el flujo, pero con precisión: ser específicos con el tipo de error, evitar pass y preferir un solo enunciado dentro de try para aislar fallos.

  • Una estrategia clara: no encierres todo el programa en try.
  • Especificidad: evita capturar BaseException sin razón.
  • Nada de pass: no atrapes para ignorar, es mala práctica y común en GitHub o GitLab.
  • Un enunciado en try: reduces ambigüedad y manejas cada posible fallo con su excepción correcta.

¿Cuál es la sintaxis mínima de try y except?

Usa try para intentar una acción y except para manejar el error concreto que esperas.

# Ejemplo: división segura def divide(numerador, denominador): if denominador == 0: raise ZeroDivisionError("No se puede dividir entre cero.") return numerador / denominador try: resultado = divide(10, 0) except ZeroDivisionError: print("Operación inválida: denominador en cero.")
  • Idea clave: si esperas una división, captura solo ZeroDivisionError.
  • Beneficio: el flujo no termina y el usuario recibe un manejo claro.

¿Cuándo usar else y finally?

Python permite extender el flujo con else y finally para expresar intención: qué pasa si todo sale bien y qué se ejecuta siempre.

try: airplane.takeoff() except TakeoffError: airplane.land() else: print("Despegue exitoso.") finally: airplane.shutdown()
  • else: se ejecuta solo si no hubo error. Útil para distinguir éxito real.
  • finally: corre siempre. Ideal para liberar recursos como cerrar archivos.

¿Qué jerarquía de errores y ejemplos conviene conocer?

Python usa programación orientada a objetos para su sistema de excepciones. BaseException es la raíz y de ahí derivan errores comunes: EndOfFileError, ImportError, FileNotFoundError, FileExistsError, y ZeroDivisionError, entre otros. Conocerlos te ayuda a ser específico al capturar.

  • BaseException: raíz de la jerarquía; permite extender con errores propios.
  • ImportError: cuando un módulo no existe o falla al importarse.
  • FileNotFoundError / FileExistsError: operaciones de archivo con rutas inexistentes o colisiones de creación.
  • ZeroDivisionError: división entre cero.

También es buena práctica definir errores específicos de tu aplicación y extender la jerarquía cuando encaja con tu problema.

# Excepción de dominio propia class AppError(BaseException): pass # Uso en flujo de negocio if not condiciones_validas: raise AppError("Reglas de negocio incumplidas.")
  • Ventaja: expresividad y trazas más claras.
  • Mantenimiento: facilita pruebas y lectura del código.

¿Has visto errores interesantes en la jerarquía de Python o definidos en algún sistema? Comparte ejemplos y cómo se adaptan a las necesidades del programa que conoces.