JavaScript de Cero a Experto / Manejo de errores y debugging
Reto: Mi Bolsillo blindado
Tu app "Mi Bolsillo" funciona… mientras nadie meta datos raros. Pero el mundo real mete valores negativos, texto donde va un número y categorías que no existen. Hoy la blindas: errores personalizados que triajan cada falla, validación en el borde y mensajes que un humano entiende. El código que resiste el abuso es lo que separa un ejercicio de un producto.
Reto
Mi Bolsillo blindado
Qué debes construir
Un módulo de bolsillo con una jerarquía de errores propios y un "borde" que los maneja con dignidad. Al correr el guion de pruebas debe imprimir EXACTAMENTE esto:
✓ Registrado: Almuerzo ($ 18.000)
✓ Registrado: Cine ($ 25.000)
⚠️ Dato inválido: El valor debe ser un número positivo (recibí: -500)
⚠️ Categoría inválida: 'cripto' no es una categoría permitida
🔧 [dev] ValorInvalidoError en campo 'valor'
Total blindado: $ 43.000
Requisitos:
- Jerarquía de errores: una clase base
BolsilloError extends Error, y dos hijas:ValorInvalidoErroryCategoriaInvalidaError. Cada una con sunamecorrecto.ValorInvalidoErrorguarda además elcampoque falló. - La factory
crearBolsillo(): movimientos privados (#movimientoso closure), un gettertotal(conreduce), yagregar(nombre, valor, categoria)que:- lanza
ValorInvalidoErrorsivalorno es un número> 0(concampo: "valor"), - lanza
CategoriaInvalidaErrorsicategoriano está en["comida", "transporte", "ocio"], - si todo va bien, guarda y devuelve el gasto.
- lanza
- El borde
registrar(bolsillo, nombre, valor, categoria): envuelve elagregarentry/catch. En elcatchusainstanceofpara imprimir el mensaje de usuario correcto (⚠️ Dato inválido:o⚠️ Categoría inválida:); si es unValorInvalidoError, imprime ADEMÁS la línea técnica🔧 [dev] ...conerror.nameyerror.campo. Un error desconocido se re-lanza. - El guion: registra Almuerzo/18000/comida y Cine/25000/ocio (éxitos), luego intenta Mercado/-500/comida y Netflix/15000/cripto (fallos), y cierra imprimiendo el total (que NO incluye los fallidos).
Reglas
- Los movimientos son privados de verdad (nadie los toca desde afuera).
- La factory LANZA; el borde
registrares el único que atrapa. - Los mensajes de usuario no llevan jerga; la línea
🔧 [dev]sí. - Formatea los pesos con
Intl.NumberFormates-CO (sin decimales).
30:00
Cuando estés listo, arranca el reloj.
Qué sigue
Módulo cerrado: tu código ya no se rompe, avisa. Pero cada vez que lo tocas,
lo pruebas a mano corriendo el guion y mirando la consola… ¿y si eso lo
hiciera una máquina, sola, en un segundo, cada vez? Ese es el módulo 16:
testing. Y arranca con una idea que te va a encantar —vas a construir tu
propio expect antes de usar el de verdad.