处理错误
本课属于 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 会覆盖损坏的文件,文件里的所有笔记都会丢失。
挑战
简单有人手动编辑了 notes.json,多留了一个逗号。现在 JSON.parse 会抛出异常,Node 也会打印一长串堆栈跟踪。让工具只打印一行清晰的错误信息,然后退出,这样它就不会把文件保存到已损坏的文件上。
- 在
store.js中,找到加载笔记的位置:store对象中的JSON.parse(readFileSync(...))。捕获文件不是有效 JSON 时JSON.parse抛出的异常。try不能放在对象内部,所以要把加载操作移到对象上方的函数或变量中,并让notes使用它的结果。 - 解析失败时,向 stderr 打印一行,然后以代码 1 退出。这一行以
notes.json is damaged:开头,后面接错误消息,也就是JSON.parse给出的原因,例如Unexpected token ']'。不要打印堆栈跟踪。也不要用空列表继续执行:接下来的add会把已损坏的笔记覆盖掉。 - 如果
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 在线编辑器