CodeForge

JavaScript de Cero a Experto / Manejo de errores y debugging

Reto: Mi Bolsillo blindado

Reto35 min60 XP

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

Media30 min60 XP(×2 sin mirar la solución)

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:

terminal

✓ 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:

  1. Jerarquía de errores: una clase base BolsilloError extends Error, y dos hijas: ValorInvalidoError y CategoriaInvalidaError. Cada una con su name correcto. ValorInvalidoError guarda además el campo que falló.
  2. La factory crearBolsillo(): movimientos privados (#movimientos o closure), un getter total (con reduce), y agregar(nombre, valor, categoria) que:
    • lanza ValorInvalidoError si valor no es un número > 0 (con campo: "valor"),
    • lanza CategoriaInvalidaError si categoria no está en ["comida", "transporte", "ocio"],
    • si todo va bien, guarda y devuelve el gasto.
  3. El borde registrar(bolsillo, nombre, valor, categoria): envuelve el agregar en try/catch. En el catch usa instanceof para imprimir el mensaje de usuario correcto (⚠️ Dato inválido: o ⚠️ Categoría inválida:); si es un ValorInvalidoError, imprime ADEMÁS la línea técnica 🔧 [dev] ... con error.name y error.campo. Un error desconocido se re-lanza.
  4. 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 registrar es el único que atrapa.
  • Los mensajes de usuario no llevan jerga; la línea 🔧 [dev] sí.
  • Formatea los pesos con Intl.NumberFormat es-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.