Ejercicios: Protocolos de Emergencia
Los accidentes en el almacén no avisan. Practica los protocolos antes de necesitarlos.
Ejercicio 10.1: Diagnóstico de Accidentes
Sin ejecutar el código, anota qué excepción produce cada línea (ValueError, TypeError, KeyError, ZeroDivisionError o FileNotFoundError). Luego verifícalo en la terminal. La tercera línea accede a un diccionario (Cap. 5); identifica primero qué operación de acceso es la que falla.
int("veinte")
"50" + 5
{"a": 1}["b"]
100 / 0
open("no_existe.txt", "r")
Pista 1: piensa qué operación de cada línea es la que realmente falla (convertir, sumar, buscar una clave, dividir o abrir) antes de adivinar el nombre exacto de la excepción.
Pista 2: cada excepción tiene un disparador fijo:
ValueError(texto no convertible a número),TypeError(tipos incompatibles en una operación),KeyError(clave ausente en un diccionario),ZeroDivisionError(dividir entre cero),FileNotFoundError(archivo que no existe).
Ejercicio 10.2: La División Protegida
Pide al usuario dos números y muestra la división. Si el segundo es cero, muestra “No se puede dividir entre cero” en lugar de explotar. Usa try/except.
Pista 1: envuelve la división (y la conversión de lo que escribió el usuario, si quieres cubrir ambos accidentes) dentro del
try.Pista 2: la excepción que lanza dividir entre cero se llama
ZeroDivisionError.
Ejercicio 10.3: Doble Protección
Amplía el ejercicio anterior: ahora también debe sobrevivir a que el usuario escriba texto en lugar de números, con un mensaje distinto por cada tipo de accidente (un except para ValueError, otro para ZeroDivisionError).
Pista 1: un solo
trypuede tener varios bloquesexcept, cada uno atrapando un tipo de error distinto.Pista 2: la conversión con
int()va dentro deltry; si el texto no es numérico, salta directo alexcept ValueErrorsin llegar siquiera a la división.
Ejercicio 10.4: El Portero Robusto
Construye la función indestructible del capítulo: pedir_numero_seguro(mensaje: str) -> int pide un número al usuario y repite la pregunta hasta que ingrese uno válido, sin romperse jamás.
- Reto: no debe tumbarse pase lo que teclee el usuario: letras, símbolos o números negativos deben terminar en una nueva pregunta, no en un traceback.
Pista 1: combina un bucle
while Truecontry/exceptpara blindar elint(), y piensa además en qué otra comprobación necesitas para que un número negativo tampoco pase: convertir"-5"conint()no falla.Pista 2: dentro del
try, la conversión conint()es la línea que puede fallar: si truena, elexcept ValueErrordeja que elwhile Truevuelva a preguntar. Después de convertir con éxito, agrega unif valor < 0que también repita la pregunta; elreturnsolo se alcanza, y solo entonces rompe el bucle, cuando el valor pasa ambas comprobaciones.
Ejercicio 10.5: El Descuento Estricto (raise + finally)
En el Ejercicio 9.6 tu aplicar_descuento devolvía None ante un precio negativo. Devolver None es susurrar; ahora ya sabes gritar.
- Reescribe
aplicar_descuento(precio, porcentaje=10)para que lance unValueErrorcon mensaje claro si el precio es negativo. - Llámala dentro de un
try/except ValueError as eque imprima el mensaje del error (e) sin tumbar el programa. - Agrega un bloque
finallyque imprima “Cotización terminada.” pase lo que pase, y comprueba que aparece en ambos caminos (precio válido y negativo).
Pista 1: piensa en qué parte del código debería detectar el precio inválido y cuál debería encargarse de reaccionar ante ese error; no tienen que ser la misma.
Pista 2: el
raise ValueError("mensaje")va dentro deaplicar_descuento; eltry/exceptque lo atrapa vive en el código que la llama.raisecorta la ejecución de la función ahí mismo: nada después de esa línea se ejecuta dentro de ella.
Soluciones: en el Apéndice B está la solución de cada ejercicio. Inténtalo por tu cuenta antes de consultarla.
Con tus datos ya protegidos contra accidentes, en el siguiente capítulo les damos un hogar permanente: leer y escribir archivos en disco, para que la información sobreviva más allá de una sola ejecución.