Excepciones en Python: manejo de errores sin esconder problemas

Aprende a capturar errores previsibles, propagar los que no controlas y diseñar flujos robustos con `try/except/else/finally`.

Manejar errores no es "evitar crashes a toda costa": es controlar escenarios esperables y dejar visibles los fallos de diseño.

Una captura demasiado amplia (`except Exception`) puede ocultar bugs críticos y hacer más difícil depurar producción.

La regla práctica: captura lo que realmente puedas manejar en ese nivel y propaga lo demás.

`else` y `finally` ayudan a separar ruta exitosa de limpieza de recursos.

  • Captura concreta = diagnóstico claro.
  • Si sabes que una conversión puede fallar por formato, captura `ValueError`, no todas las excepciones posibles.
  • Cada tipo de excepción comunica una categoría de fallo distinta; aprovecharlo mejora observabilidad.
  • Un mensaje de error útil debe indicar qué entrada falló y por qué.
  • `else` se ejecuta si no hubo excepción; `finally` siempre se ejecuta.

1) `try/except`: capturas específicas

Captura concreta = diagnóstico claro.

Si sabes que una conversión puede fallar por formato, captura `ValueError`, no todas las excepciones posibles.

Cada tipo de excepción comunica una categoría de fallo distinta; aprovecharlo mejora observabilidad.

Un mensaje de error útil debe indicar qué entrada falló y por qué.

2) `else` y `finally`: separar éxito y limpieza

`else` se ejecuta si no hubo excepción; `finally` siempre se ejecuta.

Usa `else` para lógica que solo debe ocurrir cuando la operación principal fue correcta.

Usa `finally` para cerrar conexiones, liberar recursos o registrar eventos de cierre.

Este patrón evita duplicar limpieza en múltiples ramas de error/éxito.

  • `except` para errores esperables.
  • `else` para ruta de éxito.
  • `finally` para cleanup garantizado.
  • No mezcles todo en un único bloque extenso.

3) Diseño de errores de dominio

No todos los errores son técnicos; muchos son de negocio.

Crear excepciones propias (`class SaldoInsuficienteError(Exception): ...`) hace el dominio más expresivo.

Diferenciar errores de validación, infraestructura y lógica simplifica respuesta en API/CLI.

Cuando el error es recuperable, devuelve feedback claro; cuando no lo es, propágalo con contexto.

Python
11

Excepciones en Python: manejo de errores sin esconder problemas

Aprende a capturar errores previsibles, propagar los que no controlas y diseñar flujos robustos con `try/except/else/finally`.

Código del tema: try: ... except Exception as e: ...

📘 Teoría

1) `try/except`: capturas específicas

Captura concreta = diagnóstico claro.

1

Si sabes que una conversión puede fallar por formato, captura `ValueError`, no todas las excepciones posibles.

2

Cada tipo de excepción comunica una categoría de fallo distinta; aprovecharlo mejora observabilidad.

3

Un mensaje de error útil debe indicar qué entrada falló y por qué.

Conversión segura de entero
def parse_entero(valor: str) -> int:
    try:
        return int(valor)
    except ValueError:
        raise ValueError(f'No es un entero válido: {valor}')


print(parse_entero('42'))

2) `else` y `finally`: separar éxito y limpieza

`else` se ejecuta si no hubo excepción; `finally` siempre se ejecuta.

Usa `else` para lógica que solo debe ocurrir cuando la operación principal fue correcta.

Usa `finally` para cerrar conexiones, liberar recursos o registrar eventos de cierre.

Este patrón evita duplicar limpieza en múltiples ramas de error/éxito.

  • `except` para errores esperables.
  • `else` para ruta de éxito.
  • `finally` para cleanup garantizado.
  • No mezcles todo en un único bloque extenso.
Flujo con apertura, éxito y cierre
archivo = None

try:
    archivo = open('datos.txt', 'r', encoding='utf-8')
except FileNotFoundError:
    print('Archivo no encontrado')
else:
    contenido = archivo.read()
    print('Leído:', len(contenido))
finally:
    if archivo is not None:
        archivo.close()

3) Diseño de errores de dominio

No todos los errores son técnicos; muchos son de negocio.

1

Crear excepciones propias (`class SaldoInsuficienteError(Exception): ...`) hace el dominio más expresivo.

2

Diferenciar errores de validación, infraestructura y lógica simplifica respuesta en API/CLI.

3

Cuando el error es recuperable, devuelve feedback claro; cuando no lo es, propágalo con contexto.

Excepción de negocio personalizada
class SaldoInsuficienteError(Exception):
    pass


def retirar(saldo: float, cantidad: float) -> float:
    if cantidad > saldo:
        raise SaldoInsuficienteError('No hay saldo suficiente')
    return saldo - cantidad

🧪 Aprende probando

Ejemplo Ejemplo: parseo defensivo de entrada Captura error de formato y devuelve fallback controlado para no romper flujo.

🏁 Retos

Reto Reto: captura `ValueError` de forma específica Añade manejo explícito para entrada inválida en conversión numérica.

🧰 Recursos

Test

Comprueba tus conocimientos con un test sobre Python.

Test de Python

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros 😉.

Esta la hice en febrero de 2026 para facilitar el aprendizaje de mis alumnxs. Aprender desarrollo web practicando. La idea es que crezca semanalmente con nuevos temas, tests y retos.

Inspirado en MDN, en W3Schools, en Codepen, en el crack de Manz y en mil sitios de documentación sobre desarrollo web. Quería aportar además de bloques teóricos con ejemplos, la gamificación de los retos y el sistema de test que ya tenía en culTest .

Si te gustó, si no te gustó, si quieres saludarme, o invitarme a 🍻 no dudes en escribirme en cristianeslava@gmail.com .