Lección 11 · 03 Datos del mundo real

Errores: que tu programa no se caiga

Los datos reales vienen sucios: un importe con letras, un campo que falta, un JSON mal cerrado. Un buen programa lo prevé y sigue adelante.

try y except

Pones lo arriesgado dentro de try. Si falla, en vez de pararse todo, se ejecuta el except del tipo de error correspondiente:

for valor in ["12", "doce", "7"]:
    try:
        numero = int(valor)
        print("ok:", numero)
    except ValueError:
        print("no es un número:", valor)

Captura el error concreto que esperas (ValueError, KeyError, ZeroDivisionError…). Un except: a secas lo esconde todo, también tus propios fallos, y luego nadie sabe qué pasó.

Ver el mensaje del error

import json
try:
    json.loads("{roto")
except json.JSONDecodeError as e:
    print("JSON inválido:", e)

Lanzar tus propios errores

Si un dato no tiene sentido, avisa con raise y un mensaje claro:

def descuento(porcentaje):
    if not 0 <= porcentaje <= 100:
        raise ValueError(f"porcentaje fuera de rango: {porcentaje}")
    return porcentaje / 100

try:
    descuento(150)
except ValueError as e:
    print("Aviso:", e)
// reto 01

Convierte sin romperte

Define a_numero(texto) que devuelva el número (float) si el texto lo es, y None si no. Debe aceptar coma decimal: "1,5" → 1.5.

main.py
Ctrl/⌘ + Enter
¿Atascado? Ver pista
try:
    return float(texto.replace(",", "."))
except ValueError:
    return None
$ python main.py
    // reto 02

    Sigue aunque falle uno

    Suma en total los importes válidos y guarda en malos los textos que no se pueden convertir. Imprime ambos.

    main.py
    Ctrl/⌘ + Enter
    ¿Atascado? Ver pista

    Dentro del bucle, try: total += int(i) y en except ValueError: malos.append(i).

    $ python main.py
      // reto 03

      Valida una ficha

      Define validar(ficha) que lance ValueError si falta la clave "email" o si el email no contiene @, y que devuelva True si todo está bien.

      main.py
      Ctrl/⌘ + Enter
      ¿Atascado? Ver pista
      if "email" not in ficha or "@" not in ficha["email"]:
          raise ValueError("email ausente o inválido")
      return True
      $ python main.py