Un programme qui échoue en silence coûte plus cher qu'un programme qui s'arrête. Encore faut-il que l'échec transporte de quoi comprendre : ce qui a cassé, où, et pourquoi.
C'est le rôle de l'objet Error, seul objet du langage qui capture l'endroit exact où il a été créé.
Définition
Un Error est un objet qui décrit un échec. Il porte trois propriétés : name, le type d'erreur, message, la description lisible, et stack, la suite des appels ayant mené jusque-là.
function diviser(a, b) {
if (b === 0) throw new Error("Division par zéro");
return a / b;
}
try {
diviser(10, 0);
} catch (err) {
console.log(err.name, "|", err.message); // Error | Division par zéro
} finally {
console.log("toujours exécuté");
}throw interrompt la fonction sur-le-champ et remonte de niveau en niveau jusqu'au premier try rencontré. Sans catch nulle part, l'exécution s'arrête et le message part dans la console.
Les types natifs
Le langage lève lui-même des erreurs typées. Reconnaître le nom fait gagner beaucoup de temps.
| Type | Quand il apparaît |
|---|---|
TypeError | Une valeur n'a pas la forme attendue |
ReferenceError | Un nom utilisé n'existe nulle part |
SyntaxError | Le code ou le JSON est mal formé |
RangeError | Une valeur sort des bornes permises |
Tous héritent de Error, donc err instanceof Error vaut true pour chacun. Le test instanceof sur le type précis, lui, permet de traiter un cas particulier.
Définir son propre type d'erreur
Une class qui extends Error suffit à créer un type reconnaissable, auquel on ajoute les champs utiles au traitement.
class ErreurDePaiement extends Error {
constructor(message, code) {
super(message);
this.name = "ErreurDePaiement";
this.code = code;
}
}
try {
throw new ErreurDePaiement("Carte refusée", "card_declined");
} catch (err) {
if (err instanceof ErreurDePaiement) console.log(err.code); // card_declined
}Le second argument de new Error conserve l'erreur d'origine : new Error("Configuration illisible", { cause: erreurBasse }). Le champ cause évite de choisir entre un message parlant et la trace technique, puisque les deux voyagent ensemble.
Questions fréquentes
Peut-on lancer autre chose qu'un Error ?
Le langage l'autorise, une chaîne ou un objet passent très bien. C'est pourtant à éviter : la valeur lancée n'aura ni name, ni stack, et le code qui l'attrape ne saura pas d'où elle vient. Une chaîne lancée fait perdre l'essentiel du diagnostic.
Que contient exactement stack ?
La suite des appels ayant mené à la création de l'objet, sous forme de texte. Son format n'est pas normalisé et varie d'un moteur à l'autre : servez-vous-en pour les journaux et le débogage, jamais comme d'une donnée à analyser.
Comment distinguer une erreur attendue d'un vrai défaut ?
En définissant un type pour la première. Un panier vide ou une carte refusée relèvent du parcours normal et se rattrapent, un TypeError signale un défaut à corriger. Cette séparation structure la gestion des pannes côté serveur, un sujet traité dans la formation Node.js.