错误
了解错误是什么、语法错误与运行时错误的区别,以及如何优雅地处理它们。
你将学到
- 错误是什么、程序为什么会产生错误
- 语法错误、运行时错误、逻辑错误的区别
- try/catch 如何优雅处理错误
- 如何读懂错误信息和调用栈
概念讲解
错误
错误是程序运行出问题的信号。错误不代表你这个程序员失败——它是常态,学会读懂和处理错误是一项核心技能。
三种错误
- 语法错误 —— 代码格式不对,根本无法解析。少个括号、多个逗号。程序压根不会运行。
- 运行时错误 —— 语法没问题,但执行时失败。调用不存在的函数、读取
null的属性。 - 逻辑错误 —— 程序不崩溃,但结果不对。最难找,因为没有错误信息。
读懂错误信息
运行时错误会打印信息和调用栈——导致错误的函数调用链。从栈顶往下读:第一行通常指出错误发生的文件和行号。
TypeError: Cannot read properties of undefined (reading 'name')
at getUser (app.js:12)
at render (app.js:25)
意思是:app.js 第 12 行 getUser 内部,代码试图从 undefined 上读 .name。
try / catch
你可以捕获运行时错误并优雅处理,而不是让程序崩溃:
try {
const data = JSON.parse(brokenInput);
} catch (error) {
console.log("Invalid JSON:", error.message);
}
try 里正常跑;一旦抛错,执行跳到 catch 并带上错误对象。程序继续,不崩溃。
心态
错误是反馈,不是惩罚。每条错误信息都是线索。看到错误,仔细读——它通常直接告诉你哪里出了什么问题。
示例代码
// 一个可能失败的函数:
function parseAge(input) {
const age = Number(input);
if (Number.isNaN(age)) {
throw new Error(`${input} is not a valid number`);
}
if (age < 0) {
throw new Error("Age cannot be negative");
}
return age;
}
// 用 try/catch 优雅处理:
try {
const result = parseAge("twenty");
console.log("Age:", result);
} catch (error) {
console.log("Could not parse age:", error.message);
// "Could not parse age: twenty is not a valid number"
}
parseAge 对非法输入抛出自定义错误。调用处的 try/catch 阻止崩溃,改为显示友好提示。
动手试一试
- JSON Validator
粘贴残缺 JSON 并阅读错误信息。这个工具能捕获语法错误并精确指出位置。
常见错误
错误写法
无视错误信息而不是去读它。
正确做法
读信息和调用栈。它们通常点明文件、行号和问题。花 30 秒读,能省 30 分钟瞎猜。
错误写法
用空的 catch 块悄悄吞掉错误。
正确做法
catch 块至少要记日志。静默吞错会埋下隐患,让后续调试难上加难。
相关资源
相关工具
- JSON Validator
捕获并解释 JSON 语法错误。
查阅不认识的术语
新手友好的术语表用大白话解释编程术语——变量、函数、DOM、Promise 等等。
动手做项目
通过引导式项目应用所学,含起始代码与解决方案。
解读错误信息
用大白话解释常见错误——什么意思、为什么发生、如何修复。