Menu
CoddyTech

Gestire gli errori

Fa parte della sezione Fondamenti di Node.js del percorso Node.js di Coddy. Lezione 16 di 33.

Un file notes.json modificato a mano può danneggiarsi. In tal caso JSON.parse genera un errore e Node stampa una traccia dello stack: il lungo elenco di righe di codice che hanno portato all’errore.

try esegue codice che potrebbe generare un errore. Quando accade, catch riceve l’errore e il tuo programma decide cosa dire. err.message è il motivo in una sola riga.

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

Non intercettare l’errore per poi continuare con un elenco vuoto: il successivo add sovrascriverebbe il file danneggiato e tutte le note contenute andrebbero perse.

challenge icon

Sfida

Facile

Qualcuno ha modificato notes.json a mano e ha lasciato una virgola di troppo. Ora JSON.parse genera un errore e Node stampa una lunga traccia dello stack. Fai in modo che lo strumento stampi invece una sola riga chiara e si fermi, così non salverà mai sopra il file danneggiato.

  1. In store.js, trova dove vengono caricate le note: JSON.parse(readFileSync(...)), dentro l'oggetto store. Intercetta l'errore generato da JSON.parse quando il file non è JSON valido. Un try non può trovarsi all'interno di un oggetto, quindi sposta il caricamento in una funzione o in una variabile, sopra l'oggetto, e usa il risultato per notes.
  2. Quando l'analisi non riesce, stampa una riga su stderr, poi esci con il codice 1. La riga inizia con notes.json is damaged: e prosegue con il messaggio dell'errore, cioè il motivo fornito da JSON.parse, come Unexpected token ']'. Non stampare la traccia dello stack. Non continuare con una lista vuota: il successivo add salverebbe sopra le note danneggiate.
  3. Se notes.json non esiste, il risultato deve comunque essere un archivio vuoto, come prima. Il controllo viene eseguito per ogni comando, perché ogni comando carica l'archivio.

Prova: digita list nella casella dopo $ node notes.js prima di modificare qualsiasi cosa. Vedrai una traccia dello stack rossa. Dopo la modifica, list stampa solo la riga rossa notes.json is damaged: ... e il codice di uscita 1. Per rivedere le tue note, elimina la virgola dopo "Call Ada" in notes.json ed esegui list. Poi rimetti la virgola prima di premere «Verifica»: i controlli hanno bisogno del file danneggiato e «Reimposta file» non annulla le modifiche fatte da te.

Provalo tu

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;

Tutte le lezioni di Fondamenti di Node.js

Esercitati da solo: Playground Express