Kodokon kodokon.com

Debugging et robustesse : try/catch, console avancée, erreurs personnalisées

Construisez une stratégie d'erreurs explicite avec des classes dédiées, des frontières de capture bien placées et une console exploitée à fond.

9 min · 3 questions

Ouvrir cette leçon dans Kodokon

La robustesse ne consiste pas à attraper toutes les erreurs, mais à les attraper au bon endroit. Règle de terrain : échouez vite et bruyamment au plus près du bug (validation, invariants), et ne capturez qu'aux frontières où vous pouvez réellement réagir : afficher un message, réessayer, journaliser. Un try/catch qui ne fait rien d'utile ne rend pas le code plus sûr, il rend les pannes silencieuses.

JAVASCRIPT
function parseConfig(json) {
  try {
    return JSON.parse(json);
  } catch (error) {
    console.error("Config illisible :", error.message);
    throw error; // on relance : impossible de réparer ici
  } finally {
    console.log("Lecture de configuration terminée");
  }
}
Journaliser puis relancer : la frontière supérieure décidera.

Les chaînes de caractères ne font pas une stratégie d'erreurs. Étendez Error pour créer des classes porteuses de données structurées (code HTTP, champ invalide) et discriminables via instanceof. Depuis ES2022, l'option cause chaîne l'erreur d'origine à l'erreur de haut niveau : vous exposez un message métier clair sans perdre la trace technique.

JAVASCRIPT
class ApiError extends Error {
  constructor(message, status, options) {
    super(message, options);
    this.name = "ApiError";
    this.status = status;
  }
}
try {
  const low = new Error("timeout socket");
  throw new ApiError("Profil inaccessible", 503,
    { cause: low });
} catch (error) {
  if (error instanceof ApiError) {
    console.error(error.status, error.cause.message);
  }
}
Erreur métier discriminable, cause technique préservée.

La console offre bien plus que log : console.table aligne des collections d'objets, group/groupEnd hiérarchise les sorties, time/timeEnd mesure une durée, console.assert ne journalise que si la condition est fausse, et console.trace affiche la pile d'appels courante. Combinés, ces outils remplacent avantageusement une pluie de log anonymes.

JAVASCRIPT
const users = [
  { name: "Ada", role: "admin" },
  { name: "Linus", role: "dev" },
];
console.table(users);
console.group("Vérifications");
console.assert(users.length > 0, "Liste vide");
console.time("tri");
users.sort((a, b) => a.name.localeCompare(b.name));
console.timeEnd("tri");
console.groupEnd();
Sortie structurée : tableau, groupe, assertion et chronomètre.

Quiz de validation

Vérifiez que vous avez bien retenu les points clés de cette leçon.

  1. Quand le bloc finally s'exécute-t-il ?
    • Uniquement si aucune erreur n'a été levée
    • Uniquement si le catch a été déclenché
    • Dans tous les cas, y compris après un return ou un throw
  2. À quoi sert l'option cause lors de la construction d'une erreur ?
    • À empêcher la propagation de l'erreur
    • À attacher l'erreur d'origine pour préserver le contexte technique
    • À définir automatiquement le code HTTP
    • À déclencher un nouveau catch
  3. Quel est le comportement de console.assert(condition, message) ?
    • Il journalise le message uniquement si la condition est fausse
    • Il lève une exception si la condition est fausse
    • Il journalise le message uniquement si la condition est vraie