Menu
CoddyTech

Gestion des erreurs

Fait partie de la section Les bases de Node.js du Journey Node.js de Coddy. Leçon 16 sur 33.

Un fichier notes.json modifié à la main peut être endommagé. Dans ce cas, JSON.parse lève une exception, et Node affiche une trace de pile : la longue liste des lignes de code qui ont conduit à l’erreur.

try exécute du code susceptible de lever une exception. Dans ce cas, catch reçoit l’erreur et ton programme décide quoi afficher. err.message donne la raison en une seule ligne.

let config;
try {
    config = JSON.parse('{ port: 3000 }');
} catch (err) {
    console.error(`config is broken: ${err.message}`);
    process.exit(1);
}

Ne capture pas l’erreur pour continuer avec une liste vide : le prochain add écraserait le fichier endommagé, et toutes les notes qu’il contient seraient perdues.

challenge icon

Défi

Facile

Quelqu’un a modifié notes.json à la main et a laissé une virgule de trop. Maintenant, JSON.parse lève une erreur, et Node affiche une longue trace de pile. Fais en sorte que l’outil affiche plutôt une seule ligne claire, puis s’arrête, afin qu’il n’enregistre jamais par-dessus le fichier endommagé.

  1. Dans store.js, repère l’endroit où les notes sont chargées : JSON.parse(readFileSync(...)), à l’intérieur de l’objet store. Intercepte l’erreur que JSON.parse lève lorsque le fichier n’est pas un JSON valide. Un try ne peut pas se trouver dans un objet ; déplace donc le chargement dans une fonction ou une variable au-dessus de l’objet, puis utilise son résultat pour notes.
  2. Si l’analyse échoue, affiche une seule ligne sur stderr, puis quitte avec le code 1. La ligne commence par notes.json is damaged: et se poursuit avec le message de l’erreur, qui indique la raison donnée par JSON.parse, par exemple Unexpected token ']'. N’affiche pas la trace de pile. Ne continue pas avec une liste vide : le prochain add enregistrerait par-dessus les notes endommagées.
  3. Si notes.json est absent, cela signifie toujours que le magasin est vide, comme auparavant. La vérification s’effectue pour chaque commande, car chaque commande charge le magasin.

Essaie : saisis list dans la zone après $ node notes.js avant de modifier quoi que ce soit. Tu vois une trace de pile rouge. Après ta modification, list affiche uniquement la ligne rouge notes.json is damaged: ... et le code de sortie 1. Pour revoir tes notes, supprime la virgule après "Call Ada" dans notes.json, puis exécute list. Remets ensuite la virgule avant d’appuyer sur « Vérifier » : les vérifications ont besoin du fichier endommagé, et « Réinitialiser les fichiers » n’annule pas tes propres modifications.

Essayez vous-même

import { existsSync, readFileSync, writeFileSync } from 'node:fs';

const file = 'notes.json';

const store = {
    notes: existsSync(file) ? JSON.parse(readFileSync(file, 'utf8')) : [],
    save() {
        writeFileSync(file, JSON.stringify(this.notes, null, 2));
    },
    add(text) {
        this.notes.push(text);
        this.save();
        return this.notes.length;
    },
    remove(n) {
        const [text] = this.notes.splice(n - 1, 1);
        this.save();
        return text;
    },
};

export default store;

Toutes les leçons de Les bases de Node.js

Entraînez-vous par vous-même : Playground Express