Lección 10: Errores y try/except
🎯 Objetivo
Manejar errores comunes con try/except y validar entradas del usuario para evitar que el programa se caiga.
📘 Explicación
En la vida real el usuario puede escribir letras cuando esperas números. Con try/except capturas el error y muestras un mensaje amigable.
Buena práctica: valida y repite hasta que el dato sea correcto.
🔑 Conceptos clave
- try: intenta ejecutar
- except: captura el error
- ValueError: típico al convertir texto a número
- Bucle + validación: pedir hasta que sea correcto
🧩 Ejemplos
Ejemplo 1: Capturar ValueError
try:
n = int("abc")
except ValueError:
print("No es un número")
Ejemplo 2: Validar entrada con bucle — Simula intentos.
datos = ["10", "x", "5"]
idx = 0
while True:
try:
n = int(datos[idx])
print("OK:", n)
break
except ValueError:
print("Error, intento otra vez")
idx += 1
Ejemplo 3: try/except/else — else corre si no hay error.
try:
n = int("7")
except ValueError:
print("Error")
else:
print("Convertido:", n)
Ejemplo 4: finally
try:
f = None
# ...
finally:
print("Esto siempre se ejecuta")
Ejemplo 5: Lanzar error (raise)
def validar_positivo(n):
if n <= 0:
raise ValueError("Debe ser positivo")
validar_positivo(3)
🧪 Ejercicios propuestos
- Convierte un texto a int usando try/except y muestra mensaje si falla.
- Pide (simulado) un número hasta que sea válido (usa while + try).
- Crea una función dividir(a,b) que capture división por cero.
- Convierte una lista de textos a enteros, ignorando los inválidos.
- Usa try/except/else: imprime “OK” solo si la conversión funciona.
- Crea validar_edad(edad) que lance ValueError si edad < 0.
- Usa try/finally para imprimir “Fin del proceso” siempre.
- Maneja dos excepciones: ValueError y ZeroDivisionError.
- Crea una función leer_precio(texto) que devuelva float o 0 si falla.
- Valida una lista de edades: solo acepta enteros entre 0 y 120.
✅ Ver soluciones explicadas (10 ejercicios)
Intenta primero. Luego compara con estas soluciones y lee la explicación.
Ejercicio 1: Convierte un texto a int usando try/except y muestra mensaje si falla.
texto = "abc"
try:
n = int(texto)
print(n)
except ValueError:
print("Entrada inválida")
Explicación: ValueError cuando no es numérico.
Ejercicio 2: Pide (simulado) un número hasta que sea válido (usa while + try).
entradas = ["x", "-", "12"]
idx = 0
while True:
try:
n = int(entradas[idx])
print("Número válido:", n)
break
except ValueError:
print("Error, reintenta")
idx += 1
Explicación: Simulamos input con lista.
Ejercicio 3: Crea una función dividir(a,b) que capture división por cero.
def dividir(a, b):
try:
return a / b
except ZeroDivisionError:
return None
print(dividir(10, 0))
Explicación: ZeroDivisionError cuando b=0.
Ejercicio 4: Convierte una lista de textos a enteros, ignorando los inválidos.
datos = ["1","x","3","?","4"]
nums = []
for t in datos:
try:
nums.append(int(t))
except ValueError:
pass
print(nums)
Explicación: pass ignora error.
Ejercicio 5: Usa try/except/else: imprime “OK” solo si la conversión funciona.
texto = "8"
try:
n = int(texto)
except ValueError:
print("Error")
else:
print("OK", n)
Explicación: else evita duplicación.
Ejercicio 6: Crea validar_edad(edad) que lance ValueError si edad < 0.
def validar_edad(edad):
if edad < 0:
raise ValueError("Edad no puede ser negativa")
return True
print(validar_edad(10))
Explicación: raise crea una excepción.
Ejercicio 7: Usa try/finally para imprimir “Fin del proceso” siempre.
try:
x = 10
y = 2
print(x / y)
finally:
print("Fin del proceso")
Explicación: finally siempre corre.
Ejercicio 8: Maneja dos excepciones: ValueError y ZeroDivisionError.
a = "10"
b = "0"
try:
x = int(a)
y = int(b)
print(x / y)
except ValueError:
print("No numérico")
except ZeroDivisionError:
print("No se puede dividir por cero")
Explicación: Ordena except por tipo.
Ejercicio 9: Crea una función leer_precio(texto) que devuelva float o 0 si falla.
def leer_precio(texto):
try:
return float(texto)
except ValueError:
return 0.0
print(leer_precio("2.5"))
print(leer_precio("xx"))
Explicación: Retorno seguro.
Ejercicio 10: Valida una lista de edades: solo acepta enteros entre 0 y 120.
datos = ["20","-1","abc","130","65"]
validas = []
for t in datos:
try:
e = int(t)
if 0 <= e <= 120:
validas.append(e)
except ValueError:
pass
print(validas)
Explicación: Valida rango y tipo.
⚠️ Errores comunes
- Capturar un error demasiado general sin necesidad: para básico usa ValueError.
- No repetir la entrada: capturas el error pero sigues con variable inválida (evítalo).
- No informar al usuario qué se espera (ej. “Ingresa un número”).