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.
Sfida
FacileQualcuno 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.
- In
store.js, trova dove vengono caricate le note:JSON.parse(readFileSync(...)), dentro l'oggettostore. Intercetta l'errore generato daJSON.parsequando il file non è JSON valido. Untrynon 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 pernotes. - 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 daJSON.parse, comeUnexpected token ']'. Non stampare la traccia dello stack. Non continuare con una lista vuota: il successivoaddsalverebbe sopra le note danneggiate. - Se
notes.jsonnon 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
1Eseguire JavaScript con Node
Ciao, NodeLeggere il comandoArgomenti della riga di comandoComandi3File
Testo e valori JSONLeggere un fileScrivere testo JSONScrivere un fileRimuovere una notaEsercitati da solo: Playground Express