Kodokon kodokon.com

Depuración y robustez: try/catch, consola avanzada, errores personalizados

Construye una estrategia de errores explícita con clases dedicadas, límites de captura bien colocados y una consola aprovechada al máximo.

9 min · 3 preguntas

Abrir esta lección en Kodokon

La robustez no consiste en capturar todos los errores, sino en capturarlos en el lugar adecuado. Regla de campo: falla rápido y ruidosamente lo más cerca posible del bug (validación, invariantes), y captura solo en los límites donde realmente puedes reaccionar: mostrar un mensaje, reintentar, registrar. Un try/catch que no hace nada útil no vuelve el código más seguro; vuelve los fallos silenciosos.

JAVASCRIPT
function parseConfig(json) {
  try {
    return JSON.parse(json);
  } catch (error) {
    console.error("Unreadable config:", error.message);
    throw error; // rethrow: nothing can be fixed here
  } finally {
    console.log("Finished reading configuration");
  }
}
Registra, luego relanza: el límite superior decidirá.

Las simples cadenas de texto no constituyen una estrategia de errores. Extiende Error para crear clases que lleven datos estructurados (estado HTTP, campo inválido) que puedan discriminarse con instanceof. Desde ES2022, la opción cause encadena el error original al de alto nivel: expones un mensaje de negocio claro sin perder el rastro técnico.

JAVASCRIPT
class ApiError extends Error {
  constructor(message, status, options) {
    super(message, options);
    this.name = "ApiError";
    this.status = status;
  }
}
try {
  const low = new Error("socket timeout");
  throw new ApiError("Profile unavailable", 503,
    { cause: low });
} catch (error) {
  if (error instanceof ApiError) {
    console.error(error.status, error.cause.message);
  }
}
Un error de negocio discriminable con la causa técnica preservada.

La consola ofrece mucho más que log: console.table alinea colecciones de objetos, group/groupEnd anida la salida, time/timeEnd mide una duración, console.assert solo registra cuando la condición es falsa y console.trace imprime la pila de llamadas actual. Combinadas, estas herramientas superan con creces a un chaparrón de llamadas anónimas a log.

JAVASCRIPT
const users = [
  { name: "Ada", role: "admin" },
  { name: "Linus", role: "dev" },
];
console.table(users);
console.group("Checks");
console.assert(users.length > 0, "Empty list");
console.time("sort");
users.sort((a, b) => a.name.localeCompare(b.name));
console.timeEnd("sort");
console.groupEnd();
Salida estructurada: tabla, grupo, aserción y temporizador.

Prueba de conocimientos

Comprueba que has retenido los puntos clave de esta lección.

  1. ¿Cuándo se ejecuta el bloque finally?
    • Solo si no se lanzó ningún error
    • Solo si se activó el catch
    • En todos los casos, incluso tras un return o un throw
  2. ¿Para qué sirve la opción cause al construir un error?
    • Para impedir que el error se propague
    • Para adjuntar el error original y preservar el contexto técnico
    • Para establecer el código de estado HTTP automáticamente
    • Para desencadenar un nuevo catch
  3. ¿Cuál es el comportamiento de console.assert(condition, message)?
    • Registra el mensaje solo si la condición es falsa
    • Lanza una excepción si la condición es falsa
    • Registra el mensaje solo si la condición es verdadera