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)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.
¿Atascado? Ver pista
try:
return float(texto.replace(",", "."))
except ValueError:
return NoneSigue aunque falle uno
Suma en total los importes válidos y guarda en malos los textos que no se pueden convertir. Imprime ambos.
¿Atascado? Ver pista
Dentro del bucle, try: total += int(i) y en except ValueError: malos.append(i).
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.
¿Atascado? Ver pista
if "email" not in ficha or "@" not in ficha["email"]:
raise ValueError("email ausente o inválido")
return True