Tratamento de erros
Parte da seção Fundamentos de Node.js do Journey de Node.js da Coddy. Lição 16 de 33.
Um arquivo notes.json editado manualmente pode apresentar problemas. Então, JSON.parse lança uma exceção, e o Node imprime um rastreamento de pilha: a longa lista de linhas de código que levaram ao erro.
try executa um código que pode lançar uma exceção. Quando isso acontece, catch recebe o erro, e seu programa decide o que dizer. err.message é o motivo em uma única linha.
let config;
try {
config = JSON.parse('{ port: 3000 }');
} catch (err) {
console.error(`config is broken: ${err.message}`);
process.exit(1);
}Não capture o erro e continue com uma lista vazia: o próximo add salvaria por cima do arquivo danificado, e todas as notas nele seriam perdidas.
Desafio
FácilAlguém editou notes.json manualmente e deixou uma vírgula a mais. Agora, JSON.parse gera um erro, e o Node imprime um longo rastreamento de pilha. Faça a ferramenta imprimir uma única linha clara e parar, para que ela nunca salve por cima do arquivo danificado.
- Em
store.js, encontre onde as notas são carregadas:JSON.parse(readFileSync(...)), dentro do objetostore. Capture o erro queJSON.parsegera quando o arquivo não é um JSON válido. Umtrynão pode ficar dentro de um objeto, então mova o carregamento para uma função ou variável acima do objeto e use o resultado emnotes. - Quando a análise falhar, imprima uma linha em stderr e, em seguida, saia com o código 1. A linha começa com
notes.json is damaged:e continua com a mensagem do erro, que indica o motivo dado porJSON.parse, comoUnexpected token ']'. Não imprima o rastreamento de pilha. Não continue com uma lista vazia: o próximoaddsalvaria por cima das notas danificadas. - Se
notes.jsonestiver ausente, isso ainda significa que o armazenamento está vazio, como antes. A verificação é executada para cada comando, porque todos os comandos carregam o armazenamento.
Experimente: digite list na caixa depois de $ node notes.js antes de alterar qualquer coisa. Você verá um rastreamento de pilha vermelho. Depois da alteração, list imprimirá apenas a linha vermelha notes.json is damaged: ... e o código de saída 1. Para ver suas notas novamente, exclua a vírgula depois de "Call Ada" em notes.json e execute list. Depois, coloque a vírgula de volta antes de pressionar “Verificar”: as verificações precisam do arquivo danificado, e Redefinir arquivos não desfaz suas próprias alterações.
Experimente você mesmo
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;
Todas as lições de Fundamentos de Node.js
1Executando JavaScript no Node
Olá, NodeLendo o comandoArgumentos da linha de comandoComandos3Arquivos
Texto e valores JSONLendo um arquivoEscrevendo texto JSONEscrevendo em um arquivoRemovendo uma notaPratique por conta própria: Playground de Express