Kodokon kodokon.com

Errores y excepciones: try, except, raise

Captura los fallos previsibles con try/except/else/finally y lanza tus propias excepciones para señalar datos no válidos.

9 min · 3 preguntas

Abrir esta lección en Kodokon

Un programa real falla: archivo ausente, entrada no válida, red caída. Python señala estas situaciones con excepciones, que interrumpen la ejecución y se propagan por la pila de llamadas hasta que un try/except las captura. El reflejo profesional: capturar la excepción más específica posible, lo más cerca posible del lugar donde sabes qué hacer.

PYTHON
def parse_age(text):
    try:
        return int(text)
    except ValueError:
        return None

print(parse_age("34"))      # 34
print(parse_age("thirty"))  # None
Capturamos ValueError con precisión, no todos los errores.

El bloque completo tiene cuatro ramas. try contiene el código arriesgado, except gestiona el fallo, else se ejecuta solo si no se lanzó ninguna excepción, y finally se ejecuta en todos los casos - ideal para liberar un recurso o dejar un registro. El interés de else: mantener el try lo más pequeño posible, para ver de un vistazo qué línea puede fallar.

PYTHON
values = ["10", "abc", "25"]
total = 0

for value in values:
    try:
        number = int(value)
    except ValueError:
        print(f"Skip : {value}")
    else:
        total += number
    finally:
        print(f"Process : {value}")

print(total)  # 35
else se ejecuta solo cuando no hay error; finally se ejecuta siempre.

Tus funciones también pueden lanzar sus propias excepciones con raise, en cuanto un dato recibido no es válido: mejor fallar de inmediato con un mensaje claro que producir un resultado incorrecto. Define una clase dedicada que herede de Exception: quien la llame podrá capturarla específicamente, sin interceptar por accidente otros errores.

PYTHON
class EmptyCartError(Exception):
    pass

def checkout(items):
    if not items:
        raise EmptyCartError("Empty cart.")
    return round(sum(items), 2)

try:
    print(checkout([]))
except EmptyCartError as error:
    print(f"Error : {error}")
Una excepción de negocio dedicada hace que el fallo sea explícito y preciso.

Prueba de conocimientos

Comprueba que has retenido los puntos clave de esta lección.

  1. ¿Cuándo se ejecuta el bloque else de un try/except?
    • Solo si no se lanzó ninguna excepción en el try
    • Solo si se capturó una excepción
    • En todos los casos, después del try
  2. ¿En qué casos se ejecuta el bloque finally?
    • Solo si se lanzó una excepción
    • Solo si no se lanzó ninguna excepción
    • En todos los casos, haya excepción o no
  3. ¿Por qué hay que evitar un except: desnudo que lo captura todo?
    • Oculta errores reales y hace que depurar sea muy difícil
    • Es más lento que un except específico
    • Solo funciona con las excepciones de la biblioteca estándar