Menu
CoddyTech

Fehler behandeln

Teil des Abschnitts Node.js-Grundlagen der Node.js-Journey von Coddy. Lektion 16 von 33.

Eine manuell bearbeitete notes.json kann Fehler verursachen. Dann löst JSON.parse einen Fehler aus, und Node gibt einen Stacktrace aus: die lange Liste der Codezeilen, die zum Fehler geführt haben.

try führt Code aus, der einen Fehler auslösen kann. Wenn das passiert, erhält catch den Fehler, und dein Programm entscheidet, was es ausgibt. err.message enthält den Grund in einer einzigen Zeile.

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

Fange den Fehler nicht ab und mache mit einer leeren Liste weiter: Das nächste add würde die beschädigte Datei überschreiben, und jede darin enthaltene Notiz wäre verloren.

challenge icon

Aufgabe

Einfach

Jemand hat notes.json von Hand bearbeitet und ein Komma zu viel stehen lassen. Jetzt löst JSON.parse einen Fehler aus, und Node gibt einen langen Stacktrace aus. Sorge dafür, dass das Tool stattdessen eine klare Zeile ausgibt und dann beendet wird, damit es die beschädigte Datei niemals überschreibt.

  1. Suche in store.js die Stelle, an der die Notizen geladen werden: JSON.parse(readFileSync(...)) innerhalb des Objekts store. Fange den Fehler ab, den JSON.parse auslöst, wenn die Datei kein gültiges JSON enthält. Ein try kann nicht innerhalb eines Objekts stehen. Verlagere das Laden also in eine Funktion oder Variable oberhalb des Objekts und verwende deren Ergebnis für notes.
  2. Wenn das Parsen fehlschlägt, gib eine Zeile auf stderr aus und beende dann das Programm mit Code 1. Die Zeile beginnt mit notes.json is damaged: und fährt mit der Fehlermeldung fort, also dem Grund, den JSON.parse angibt, zum Beispiel Unexpected token ']'. Gib den Stacktrace nicht aus. Fahre nicht mit einer leeren Liste fort: Der nächste Aufruf von add würde die beschädigten Notizen überschreiben.
  3. Eine fehlende notes.json bedeutet weiterhin, dass der Speicher leer ist, wie bisher. Die Prüfung wird bei jedem Befehl ausgeführt, da jeder Befehl den Speicher lädt.

Probiere es aus: Gib list in das Feld nach $ node notes.js ein, bevor du etwas änderst. Du siehst einen roten Stacktrace. Nach deiner Änderung gibt list nur die rote Zeile notes.json is damaged: ... und den Exit-Code 1 aus. Um deine Notizen wieder zu sehen, lösche das Komma nach "Call Ada" in notes.json und führe list aus. Füge das Komma wieder ein, bevor du auf „Prüfen“ klickst: Die Prüfungen benötigen die beschädigte Datei, und „Dateien zurücksetzen“ macht deine eigenen Änderungen nicht rückgängig.

Probier es selbst

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;

Alle Lektionen in Node.js-Grundlagen

Übe selbstständig: Express-Playground