Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

Los errores son inevitables en cualquier programa, y Python ofrece varias formas de manejarlos.
El manejo de errores es crucial para asegurar que tu programa pueda continuar ejecutándose de manera segura y eficiente, incluso cuando sucede algo inesperado.

En esta lección, exploraremos los diferentes tipos de errores, cómo manejarlos, cómo lanzar tus propios errores y cómo asegurarte de que las tareas importantes de limpieza siempre se ejecuten.


Tipos de errores en Python

Antes de aprender a manejar errores, necesitamos entender las dos categorías principales:

  • Errores de sintaxis: Ocurren cuando el código Python no es sintácticamente correcto. Son detectados por el intérprete de Python antes de que el programa se ejecute.
    Ejemplo: olvidar dos puntos después de una sentencia if.

  • Excepciones: Ocurren mientras el programa se está ejecutando cuando sucede algo inesperado — por ejemplo, dividir un número entre cero o intentar acceder a un índice inválido en una lista.

Manejo de excepciones con try y except

La forma más común de manejar excepciones en Python es con bloques try/except:

  • El bloque try contiene el código que podría causar una excepción.
  • El bloque except contiene el código a ejecutar si se lanza una excepción.

Ejemplo:

try:
    file = open("file.txt", "r")
    content = file.read()
    print(content)
except IOError:
    print("No se pudo abrir el archivo.")

Aquí:

  • Si "file.txt" no existe o no puede abrirse, Python lanza un IOError.
  • El bloque except lo captura y muestra un mensaje amigable en lugar de que el programa falle.
TIP: Mantén el bloque try tan pequeño como sea posible — solo incluye el código que podría fallar, no lógica no relacionada.

Manejo de múltiples tipos de excepción

Puedes manejar diferentes tipos de excepciones por separado usando múltiples bloques except:

try:
    # código que puede generar excepciones
except TypeError:
    # manejar errores de tipo
except ValueError:
    # manejar errores de valor
except:
    # manejar cualquier otra excepción

El último except sin especificar captura cualquier excepción no manejada — pero úsalo con cuidado, ya que puede ocultar errores inesperados.

Lanzando tus propias excepciones

A veces tu programa necesita señalar que algo salió mal — incluso si Python normalmente no lo consideraría un error. Puedes lanzar excepciones utilizando la sentencia raise.

Ejemplo:

def divide(a, b):
    if b == 0:
        raise ValueError("El segundo argumento no puede ser cero")
    return a / b

print(divide(10, 2))  # 5.0
print(divide(10, 0))  # ValueError: El segundo argumento no puede ser cero

Esto te permite definir mensajes claros de error y detener la ejecución cuando se encuentran datos inválidos.

El bloque finally

El bloque finally define código que siempre se ejecuta — sin importar si ocurrió o no una excepción. Se usa a menudo para liberar recursos como archivos o conexiones de base de datos.

Ejemplo:

try:
    file = open("file.txt", "r")
    content = file.read()
    print(content)
finally:
    file.close()

Incluso si leer el archivo causó un error, el bloque finally asegura que el archivo se cierre.

¡IMPORTANTE!: Siempre cierra los archivos y libera recursos en un bloque finally (o usa la sentencia "with") para evitar fugas.


Entendido — aquí tienes una sección adicional que puedes agregar a la lección de Manejo de errores, explicando por qué “intentar/atrapar todo” es una mala práctica y cuándo el manejo selectivo de excepciones es la elección correcta.


Evita capturar toda excepción sin razón

Un error común entre principiantes es envolver grandes bloques de código en un solo bloque try/except que captura todo — o peor aún, usar un except: sin especificar el tipo de error.

Ejemplo de mala práctica:

try:
    # mucho código no relacionado aquí
except:
    pass  # ignora silenciosamente todos los errores

Por qué es peligroso:

  • Oculta errores: Los errores reales en tu código serán ignorados, dificultando encontrarlos.
  • Enmascara la causa: Pierdes información sobre qué falló realmente.
  • Puede causar comportamientos inesperados: El programa sigue corriendo en un estado inválido.

Cuándo usar un manejo amplio de excepciones

Capturar todas las excepciones (except Exception:) debería ser raro y hecho con intención. Ejemplos donde podría ser apropiado:

  • Registro de errores a nivel principal en un programa, para evitar un fallo y escribir el error en un archivo de registro.
  • Bucles a prueba de fallos en servicios que deben seguir funcionando (pero aún así registrar/reportar el error antes de continuar).
  • Depuración temporal para ver rápidamente si algo está fallando — pero solo como una herramienta a corto plazo.

Buenas prácticas

  • Sé específico: Captura solo las excepciones que esperas y sabes cómo manejar.
  • Mantén los bloques try pequeños: Envuelve solo el código que puede fallar, no funciones enteras.
  • Siempre registra o maneja la excepción de manera significativa — no solo “pases” y la olvides.

Si eres selectivo, tu código será más fácil de depurar, más seguro y mucho más predecible.


Conclusión

El manejo de errores es una parte fundamental de la programación en Python:

  • Evita fallos inesperados.
  • Permite manejar problemas con gracia.
  • Hace tu código más robusto, fiable y seguro.

Al dominar las excepciones, lanzar errores personalizados y usar finally, escribirás programas mejor preparados para el mundo real.