Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 try puede tener varios bloques except, cada uno atrapando un tipo de error distinto.

Pista 2: la conversión con int() va dentro del try; si el texto no es numérico, salta directo al except ValueError sin 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 True con try/except para blindar el int(), y piensa además en qué otra comprobación necesitas para que un número negativo tampoco pase: convertir "-5" con int() no falla.

Pista 2: dentro del try, la conversión con int() es la línea que puede fallar: si truena, el except ValueError deja que el while True vuelva a preguntar. Después de convertir con éxito, agrega un if valor < 0 que también repita la pregunta; el return solo 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.

  1. Reescribe aplicar_descuento(precio, porcentaje=10) para que lance un ValueError con mensaje claro si el precio es negativo.
  2. Llámala dentro de un try/except ValueError as e que imprima el mensaje del error (e) sin tumbar el programa.
  3. Agrega un bloque finally que 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 de aplicar_descuento; el try/except que lo atrapa vive en el código que la llama. raise corta 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.