Menu
CoddyTech

Manejo de errores

Parte de la sección Conceptos básicos de Node.js del Journey de Node.js de Coddy. Lección 16 de 33.

Un archivo notes.json editado a mano puede dañarse. Entonces JSON.parse lanza una excepción y Node imprime un seguimiento de la pila: la larga lista de líneas de código que provocaron el error.

try ejecuta código que puede lanzar una excepción. Cuando ocurre, catch recibe el error y tu programa decide qué decir. err.message es el motivo en una sola línea.

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

No captures el error para continuar con una lista vacía: el siguiente add sobrescribiría el archivo dañado y se perderían todas las notas que contiene.

challenge icon

Desafío

Fácil

Alguien editó notes.json a mano y dejó una coma de más. Ahora JSON.parse lanza un error y Node imprime una traza de pila larga. Haz que la herramienta imprima una sola línea clara y se detenga, para que nunca guarde encima del archivo dañado.

  1. En store.js, busca dónde se cargan las notas: JSON.parse(readFileSync(...)), dentro del objeto store. Captura el error que lanza JSON.parse cuando el archivo no es JSON válido. Un try no puede ir dentro de un objeto, así que mueve la carga a una función o variable situada por encima del objeto y usa su resultado para notes.
  2. Cuando falle el análisis, imprime una línea en stderr y luego sal con el código 1. La línea empieza con notes.json is damaged: y continúa con el mensaje del error, que indica el motivo que da JSON.parse, como Unexpected token ']'. No imprimas la traza de pila. No continúes con una lista vacía: el siguiente add guardaría encima de las notas dañadas.
  3. Si falta notes.json, sigue significando que el almacén está vacío, como antes. La comprobación se ejecuta para cada comando, porque todos los comandos cargan el almacén.

Pruébalo: escribe list en el cuadro después de $ node notes.js antes de cambiar nada. Verás una traza de pila roja. Después de hacer el cambio, list imprimirá solo la línea roja notes.json is damaged: ... y el código de salida 1. Para volver a ver tus notas, elimina la coma después de "Call Ada" en notes.json y ejecuta list. Luego vuelve a poner la coma antes de pulsar «Comprobar»: las comprobaciones necesitan el archivo dañado, y Restablecer archivos no deshace tus propios cambios.

Pruébalo tú mismo

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 las lecciones de Conceptos básicos de Node.js

Practica por tu cuenta: Playground de Express