Menu
CoddyTech

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.

challenge icon

Desafio

Fácil

Algué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.

  1. Em store.js, encontre onde as notas são carregadas: JSON.parse(readFileSync(...)), dentro do objeto store. Capture o erro que JSON.parse gera quando o arquivo não é um JSON válido. Um try nã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 em notes.
  2. 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 por JSON.parse, como Unexpected token ']'. Não imprima o rastreamento de pilha. Não continue com uma lista vazia: o próximo add salvaria por cima das notas danificadas.
  3. Se notes.json estiver 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

Pratique por conta própria: Playground de Express