Manejo de Excepciones

Captura y gestión de errores


En la ejecución de un programa, es común que se presenten situaciones inesperadas, como dividir entre cero, acceder a un archivo que no existe o intentar convertir texto a número sin éxito. Para manejar estos eventos sin que el programa se detenga abruptamente, Python ofrece un mecanismo llamado excepciones.


¿Qué es una excepción?

Una excepción es un tipo especial de objeto que indica que ha ocurrido un error o una condición anómala durante la ejecución de un programa. Si no se maneja adecuadamente, la excepción detiene el programa y muestra un mensaje de error.

Las excepciones no son exclusivas de Python. De hecho, la mayoría de los lenguajes modernos de programación cuentan con mecanismos similares para el control de errores.


Captura y gestión de errores:

Python proporciona un bloque de control denominado try-except, que permite capturar y manejar excepciones. Esto es fundamental para evitar que los errores detengan la ejecución completa de un programa.

Ejemplo: División entre cero
a = 10
b = 0
  
try:
    resultado = a / b
except ZeroDivisionError:
    print("No se puede dividir entre cero.")

En este caso, si se produce una división entre cero, el flujo del programa pasa automáticamente al bloque except, evitando el cierre inesperado del programa.


Excepciones comunes en Python:

Algunas excepciones frecuentes que puedes encontrar en Python incluyen:

  • ZeroDivisionError: cuando se intenta dividir entre cero.
  • TypeError: al realizar operaciones entre tipos incompatibles (como sumar un número y una cadena).
  • ValueError: al convertir una cadena que no representa un número a tipo int o float.
  • IndexError: al acceder a un índice fuera del rango de una lista.
  • FileNotFoundError: al intentar abrir un archivo que no existe.
  • KeyError: al intentar acceder a una clave que no está presente en un diccionario.
Ejemplo: Suma inválida
try:
    resultado = "texto" + 5
except TypeError:
    print("No se pueden sumar una cadena y un número.")

Lanzar excepciones manualmente con raise:

Python permite lanzar nuestras propias excepciones utilizando la instrucción raise.

Esto puede ser útil para validar condiciones específicas en nuestros programas.

Ejemplo: Uso de raise
numero = -5
  
if numero < 0:
    raise ValueError("El número no puede ser negativo.")

También puedes lanzar excepciones predefinidas como NameError, o incluso definir tus propias excepciones personalizadas (veremos esto más adelante).


Estructura completa del manejo de excepciones:

Python permite usar bloques adicionales dentro de la estructura try-except:

  • else: se ejecuta si no ocurre ninguna excepción.
  • finally: se ejecuta siempre, ocurra o no ocurra una excepción.
Ejemplo: Uso de try, except, else y finally
try:
    numero = int(input("Introduce un número: "))
    resultado = 10 / numero
except ZeroDivisionError:
    print("Error: no se puede dividir entre cero.")
except ValueError:
    print("Error: debes introducir un número válido.")
else:
    print("El resultado es:", resultado)
finally:
    print("Fin del proceso.")

¿Cuándo usar finally? Este bloque es ideal para liberar recursos, cerrar archivos o realizar tareas de limpieza que deben ejecutarse sin importar si ocurrió un error.


Capturar múltiples excepciones:

Puedes capturar varias excepciones en bloques separados o en uno solo, agrupándolas entre paréntesis:

try:
    # código que puede fallar
except (ValueError, TypeError) as e:
    print(f"Ocurrió un error: {e}")

Capturar excepciones genéricas:

Si no estás seguro de qué tipo de error puede ocurrir, puedes capturar la excepción base Exception, aunque esto debe usarse con precaución, ya que podría ocultar errores que deberían resolverse explícitamente.

try:
    # código que puede fallar
except Exception as e:
    print(f"Se produjo un error inesperado: {e}")

Ejemplo práctico: Manejo de archivos

try:
    archivo = open("datos.txt", "r")
    contenido = archivo.read()
except FileNotFoundError:
    print("El archivo no existe.")
else:
    print("Contenido del archivo:", contenido)
finally:
    if 'archivo' in locals():
        archivo.close()

Buenas prácticas en el manejo de excepciones:

  • Captura únicamente las excepciones que esperas. Evita capturar errores genéricos innecesariamente.
  • Maneja las excepciones de forma que ayuden al usuario o al programa a continuar.
  • No abuses del uso de try-except como sustituto de validaciones lógicas.
  • Incluye mensajes claros y útiles.