Menu
CoddyTech

エラー処理

CoddyのNode.jsジャーニー「Node.jsの基礎」セクションの一部。レッスン 16/33。

手作業で編集したnotes.jsonは、壊れることがあります。そうなると、JSON.parseは例外をスローし、Nodeはスタックトレース、つまりエラーにつながった長いコード行の一覧を表示します。

tryは、例外をスローする可能性のあるコードを実行します。例外がスローされると、catchがエラーを受け取り、プログラムが何を伝えるかを決めます。err.messageは、その理由を1行で示します。

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

エラーを捕捉して空のリストで処理を続けてはいけません。次のaddで破損したファイルが上書き保存され、その中のメモがすべて失われてしまいます。

challenge icon

チャレンジ

簡単

誰かが手作業でnotes.jsonを編集し、余分なカンマを1つ残しました。そのためJSON.parseが例外を投げ、Nodeは長いスタックトレースを表示します。代わりにツールがわかりやすい1行だけを表示して終了するようにし、破損したファイルを上書き保存しないようにしましょう。

  1. store.jsで、メモを読み込んでいる箇所、つまりstoreオブジェクト内のJSON.parse(readFileSync(...))を探します。ファイルが有効なJSONでないときにJSON.parseが投げるエラーを捕捉します。オブジェクト内にtryは置けないので、読み込み処理をオブジェクトの上にある関数または変数に移し、その結果をnotesに使ってください。
  2. 解析に失敗したら、stderrに1行表示してから、終了コード1で終了します。その行はnotes.json is damaged: で始まり、その後にエラーメッセージを続けます。これはJSON.parseが示す理由で、たとえばUnexpected token ']'のようなものです。スタックトレースは表示しないでください。空のリストで処理を続けてはいけません。次のaddで、破損したメモが上書き保存されてしまいます。
  3. notes.jsonがない場合は、これまでどおり空のストアとして扱います。すべてのコマンドでストアを読み込むため、このチェックはすべてのコマンドで実行されます。

試してみましょう:変更を加える前に、$ node notes.jsの後のボックスにlistと入力します。赤いスタックトレースが表示されます。変更後は、listを実行すると赤い行notes.json is damaged: ...だけが表示され、終了コード1で終了します。再びメモを見るには、notes.json内の"Call Ada"の後にあるカンマを削除してから、listを実行します。「確認」を押す前に、カンマを元に戻してください。チェックでは破損したファイルが必要で、「ファイルをリセット」では自分で加えた編集は元に戻りません。

自分で試してみよう

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;

Node.jsの基礎のすべてのレッスン

自分で練習してみよう: Expressプレイグラウンド