Menu
CoddyTech

Obsługa błędów

Część sekcji Podstawy Node.js ścieżki Node.js w Coddy. Lekcja 16 z 33.

Ręcznie edytowany plik notes.json może przestać działać. Wtedy JSON.parse zgłasza wyjątek, a Node wyświetla ślad stosu: długą listę wierszy kodu, które doprowadziły do błędu.

try uruchamia kod, który może zgłosić wyjątek. Gdy tak się stanie, catch otrzymuje błąd, a Twój program decyduje, co wyświetlić. err.message zawiera jednolinijkowy opis przyczyny.

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

Nie przechwytuj błędu i nie kontynuuj działania z pustą listą: następne add zapisałoby zmiany w uszkodzonym pliku, a wszystkie zapisane w nim notatki zostałyby utracone.

challenge icon

Wyzwanie

Łatwy

Ktoś ręcznie edytował plik notes.json i zostawił o jeden przecinek za dużo. Teraz JSON.parse zgłasza błąd, a Node wyświetla długi ślad stosu. Zmień narzędzie tak, aby zamiast tego wyświetlało jeden czytelny wiersz i kończyło działanie, dzięki czemu nigdy nie zapisze danych w uszkodzonym pliku.

  1. W pliku store.js znajdź miejsce, w którym wczytywane są notatki: JSON.parse(readFileSync(...)) wewnątrz obiektu store. Przechwyć błąd zgłaszany przez JSON.parse, gdy plik nie zawiera prawidłowego JSON-a. try nie może znajdować się wewnątrz obiektu, więc przenieś wczytywanie do funkcji lub zmiennej umieszczonej przed obiektem i użyj jej wyniku dla notes.
  2. Gdy parsowanie się nie powiedzie, wyświetl jeden wiersz na stderr, a następnie zakończ działanie z kodem 1. Wiersz zaczyna się od notes.json is damaged: , a dalej zawiera komunikat błędu, czyli przyczynę podawaną przez JSON.parse, na przykład Unexpected token ']'. Nie wyświetlaj śladu stosu. Nie kontynuuj działania z pustą listą: następne polecenie add zapisałoby dane w miejsce uszkodzonych notatek.
  3. Brak pliku notes.json nadal oznacza pusty magazyn, tak jak wcześniej. Sprawdzenie jest wykonywane przy każdym poleceniu, ponieważ każde polecenie wczytuje magazyn.

Wypróbuj: zanim cokolwiek zmienisz, wpisz list w polu po $ node notes.js. Zobaczysz czerwony ślad stosu. Po wprowadzeniu zmiany polecenie list wyświetli tylko czerwony wiersz notes.json is damaged: ... i kod wyjścia 1. Aby znów zobaczyć swoje notatki, usuń przecinek po "Call Ada" w pliku notes.json i uruchom polecenie list. Następnie przywróć przecinek, zanim naciśniesz „Sprawdź”: testy wymagają uszkodzonego pliku, a opcja Reset files nie cofa wprowadzonych przez ciebie zmian.

Spróbuj swoich sił

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;

Wszystkie lekcje w sekcji Podstawy Node.js

Poćwicz samodzielnie: Edytor online Express