circle-info
Desarrollo en curso, en breve se publicarán el resto de temas.

Capítulo 9: Manejo de excepciones

Una excepción es un error que ocurre durante la ejecución de un programa y que interrumpe su flujo normal, pero no está necesariamente vinculado a un error de sintaxis. Pueden ser causadas por datos de entrada incorrectos, recursos no disponibles u operaciones inválidas. Un manejo de excepciones adecuado es la diferencia entre una aplicación frágil que se detiene inesperadamente y una aplicación robusta que puede anticipar, gestionar y recuperarse de los errores de forma elegante.

En Python, el manejo de excepciones se realiza mediante las estructuras try, except, else y finally, que nos permiten capturar errores específicos, manejarlos apropiadamente y ejecutar código de limpieza cuando sea necesario.

9.1. ¿Qué son las excepciones?

Las excepciones son eventos que interrumpen el flujo normal de ejecución de un programa. Aunque el código sea sintácticamente correcto, pueden ocurrir errores durante la ejecución por diversos motivos:

  • Entrada de usuario incorrecta: El usuario introduce texto donde se espera un número

  • Recursos no disponibles: Un archivo no existe o no se puede acceder

  • Operaciones inválidas: División por cero, acceso a índices fuera de rango

  • Problemas de red: Conexión perdida, servidor no responde

  • Memoria insuficiente: El sistema no tiene suficientes recursos

Ejemplo básico sin manejo de excepciones

# Sin manejo de excepciones - el programa se detiene
print(5 / 0)  # ZeroDivisionError: division by zero
print("Esta línea nunca se ejecutará")

Con manejo de excepciones

# Con manejo de excepciones - el programa continúa
try:
    print(5 / 0)
except ZeroDivisionError:
    print("No se puede dividir por cero")

print("Esta línea sí se ejecutará")

9.2. Estructura básica: try-except

La forma fundamental de manejar excepciones en Python es con el bloque try-except.

  • El código que podría generar un error se coloca dentro del bloque try.

  • Si se produce una excepción dentro del bloque try, Python busca una cláusula except que coincida con el tipo de excepción. Si la encuentra, ejecuta el código de ese bloque.

Sintaxis básica

Ejemplo práctico: División segura

circle-check

9.3. Excepciones múltiples y jerarquía

Capturar múltiples excepciones con una sola cláusula

Capturar excepciones en cascada

9.4. Captura genérica con Exception

Capturar cualquier excepción

Información detallada del error

9.5. Las cláusulas else y finally

La estructura try-except puede ampliarse con dos cláusulas opcionales: else y finally.

  • else: El bloque de código dentro de else se ejecuta solo si no ocurre ninguna excepción en el bloque try. Es útil para separar la lógica que debe ejecutarse cuando todo va bien.

  • finally: El bloque de código dentro de finally se ejecuta siempre, sin importar si ocurrió una excepción o no. Su propósito principal es realizar tareas de "limpieza", como cerrar archivos o conexiones a bases de datos.

9.6. Excepciones comunes en Python

ValueError: Valor incorrecto

TypeError: Tipo incorrecto

IndexError y KeyError

9.7. Lanzar excepciones con raise

Además de capturar excepciones, también podemos lanzarlas manualmente usando la palabra clave raise. Esto es útil para señalar errores basados en la lógica de negocio de nuestra aplicación. Para errores muy específicos, se pueden crear clases de excepción personalizadas heredando de Exception.

9.8. Caso práctico: Sistema de login

Este ejemplo implementa un sistema de login robusto que maneja múltiples tipos de errores, incluyendo entradas inválidas y credenciales incorrectas, con un límite de intentos.

9.9. Mejores prácticas

✅ Buenas prácticas

  • Sé específico al capturar excepciones: Captura los errores concretos que esperas (ValueError, FileNotFoundError).

  • No silencies errores: Evita los bloques except: pass, ya que ocultan problemas y dificultan la depuración.

  • Usa finally para la limpieza: Garantiza que los recursos se liberen correctamente.

❌ Prácticas a evitar

  • No usar except vacío: Es el peor anti-patrón, ya que captura absolutamente todo, incluyendo SystemExit y KeyboardInterrupt.

  • No capturar Exception de forma genérica sin necesidad: A menos que estés registrando el error y volviéndolo a lanzar, esto puede ocultar errores que no esperabas.

  • No usar excepciones para el control de flujo normal: Son para situaciones excepcionales, no para la lógica habitual del programa.

Resumen del Capítulo

El manejo adecuado de excepciones es fundamental para crear aplicaciones robustas y confiables. Python proporciona un sistema completo de manejo de errores que permite capturar, procesar y recuperarse de situaciones excepcionales de manera elegante, mejorando significativamente la experiencia del usuario y la estabilidad del software.

💡 Conceptos Clave:

  • try-except: Estructura básica para capturar y manejar errores

  • Excepciones específicas: ValueError, TypeError, FileNotFoundError, etc.

  • else: Se ejecuta solo si NO ocurre ninguna excepción

  • finally: Se ejecuta SIEMPRE, para limpieza de recursos

  • raise: Lanzar excepciones personalizadas

  • Excepciones personalizadas: Crear clases de error específicas para tu aplicación

🤔 Preguntas de Reflexión:

  1. ¿Cuándo es apropiado usar except Exception en lugar de excepciones específicas?

  2. ¿Qué diferencia existe entre los bloques else y finally?

  3. ¿En qué situaciones crearías tus propias clases de excepción?

  4. ¿Cómo puede el manejo de excepciones mejorar la experiencia del usuario?

🔧 Ejercicio Práctico:

Crea un programa que:

  1. Implemente un sistema de gestión de inventario con validaciones

  2. Use excepciones específicas para diferentes tipos de errores

  3. Incluya manejo de archivos con try-except-finally

  4. Cree excepciones personalizadas para reglas de negocio

  5. Proporcione mensajes de error informativos y opciones de recuperación

Escribir código que funciona y es robusto ante los fallos es solo la mitad de la ecuación. La otra mitad es escribirlo de una manera que sea clara, consistente y fácil de mantener; esto es precisamente lo que aprenderemos en el próximo capítulo.

Última actualización

¿Te fue útil?