Pensamiento Computacional (090) · Unidad 5 — Entrada, salida y errores
Manejo de errores
try / except deja que el programa siga cuando algo falla. Pero atrapar todo sin mirar esconde los errores en vez de arreglarlos.
La explicación
El problema
Un error corta el programa. Si el usuario escribe "hola" donde iba un número,
int() tira ValueError y todo lo que venía después no se ejecuta.
try y except
edad = int(input("Edad: "))
except ValueError:
print("Eso no es un número")
Python intenta lo del try. Si sale bien, saltea el except. Si falla
con ese error, ejecuta el except y el programa sigue.
Los errores que más vas a ver
TypeError "a" + 1 tipos incompatibles
ZeroDivisionError 10 / 0
IndexError [1,2][5] posición que no existe
KeyError d["pepe"] clave que no existe
FileNotFoundError open("no.txt")
NameError usar una variable no definida
TypeError que menciona NoneType casi
siempre significa que una función terminó sin return — lo que vimos en el tema 2.5.
Varios except
resultado = int(a) / int(b)
except ValueError:
print("No son números")
except ZeroDivisionError:
print("No se puede dividir por cero")
Se ejecuta el primero que coincida, igual que un elif.
El except vacío, y por qué no conviene
...
except: # atrapa absolutamente todo
pass
NameError, quedaría atrapado ahí, y el programa seguiría como si nada —
dando resultados mal sin que nadie se entere. Atrapá el error que esperás, no todos.
Validar en un ciclo
try:
edad = int(input("Edad: "))
break # sólo llega acá si el int() funcionó
except ValueError:
print("Poné un número entero")
Es el patrón estándar para pedir un dato hasta que sea válido. El break va
después de la línea que puede fallar: si falla, nunca se alcanza.
Escribir una función que pida un número por teclado y no siga hasta que el usuario escriba uno válido.
while True:
try:
return int(input("Número: "))
except ValueError:
print("Eso no es un número entero. Probá de nuevo.")
Cómo corre. Si el usuario escribe 25, el int() funciona, el
return devuelve 25 y la función termina. Si escribe hola, el
int() falla, se ejecuta el except, y el while True da
otra vuelta.
return hace de break. Está en la misma línea que puede
fallar: si int() explota, nunca se llega a devolver nada. Si hubieras escrito
return int(numero) ← el error ocurre acá
return
afuera del try.
Por qué except ValueError y no except a secas. Si el usuario
corta el programa con Ctrl+C, un except vacío lo atraparía también y no habría
forma de salir. Atrapando sólo ValueError, todo lo demás sigue funcionando normal.
Control: probá con un número, con texto, y con el Enter vacío. Los tres tienen que
comportarse como esperás — el vacío también es ValueError.
Dónde se cae la mayoría
- Usar except vacío y esconder errores reales, incluidos los de tipeo.
- Poner el break antes de la línea que puede fallar, y salir del ciclo con el dato inválido.
- Envolver medio programa en un try enorme: cuando falla, no se sabe qué parte fue.
Hasta acá la explicación. La práctica es la otra mitad: 7 ejercicios de este tema, en cuatro niveles, que no te dicen sólo si está bien al final sino que te corrigen en cada paso y te explican por qué. Además trae una animación que muestra la idea en movimiento.
Practicar Manejo de errores →