Menu
CoddyTech

处理错误

本课属于 Coddy Node.js 学习旅程的“Node.js 基础”单元。第 16 课,共 33 课。

手动编辑的 notes.json 可能会损坏。这样一来,JSON.parse 就会抛出异常,Node 会打印堆栈跟踪:导致错误的那一长串代码行。

try 用来运行可能抛出异常的代码。发生异常时,catch 会接收错误,然后由你的程序决定要显示什么。err.message 是用一行文字说明原因。

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,多留了一个逗号。现在 JSON.parse 会抛出异常,Node 也会打印一长串堆栈跟踪。让工具只打印一行清晰的错误信息,然后退出,这样它就不会把文件保存到已损坏的文件上。

  1. 在 store.js 中,找到加载笔记的位置:store 对象中的 JSON.parse(readFileSync(...))。捕获文件不是有效 JSON 时 JSON.parse 抛出的异常。try 不能放在对象内部,所以要把加载操作移到对象上方的函数或变量中,并让 notes 使用它的结果。
  2. 解析失败时,向 stderr 打印一行,然后以代码 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 在线编辑器