Lección 10 · Robustez

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

  1. Convierte un texto a int usando try/except y muestra mensaje si falla.
  2. Pide (simulado) un número hasta que sea válido (usa while + try).
  3. Crea una función dividir(a,b) que capture división por cero.
  4. Convierte una lista de textos a enteros, ignorando los inválidos.
  5. Usa try/except/else: imprime “OK” solo si la conversión funciona.
  6. Crea validar_edad(edad) que lance ValueError si edad < 0.
  7. Usa try/finally para imprimir “Fin del proceso” siempre.
  8. Maneja dos excepciones: ValueError y ZeroDivisionError.
  9. Crea una función leer_precio(texto) que devuelva float o 0 si falla.
  10. 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”).