JavaScript 错误
为什么要处理错误
程序运行时难免出错:引用不存在的变量、网络请求失败、用户输入不合法等。若不加处理,脚本会在出错处停止,甚至让页面功能瘫痪。JavaScript 提供了 try、catch、throw、finally 四个关键字来处理运行时错误,让程序"出错而不崩溃"。
语法错误与运行时错误
- 语法错误:拼写或结构不对,代码根本无法执行,例如漏写右括号。
- 运行时错误:代码能运行,执行到某一步才出错,例如调用未定义的方法。 这两类错误中,运行时错误可以被 try...catch 捕获处理。
try...catch 捕获错误
把可能出错的代码放进 try 块,出错时 catch 会收到错误对象:
try {
var list = null;
console.log(list.length); // 这一行会抛 TypeError
} catch (err) {
console.log("捕获到错误:" + err.message);
// 输出:捕获到错误:Cannot read properties of null (reading 'length')
}
console.log("程序继续运行");
// 输出:程序继续运行
throw 主动抛出错误
程序自己发现异常情况时,可以用 throw 主动抛错,抛出 Error 对象最规范:
function divide(a, b) {
if (b === 0) {
throw new Error("除数不能为 0");
}
return a / b;
}
try {
console.log(divide(10, 0));
} catch (err) {
console.log(err.name + ":" + err.message);
// 输出:Error:除数不能为 0
}
finally 收尾
无论 try 中是否出错,finally 里的代码都会执行,适合做关闭资源、清理状态等收尾工作:
try {
console.log("执行任务");
} catch (err) {
console.log("出错了");
} finally {
console.log("收尾工作一定执行");
}
// 输出:执行任务
// 输出:收尾工作一定执行
Error 对象与内置错误类型
捕获到的错误对象常用 name(类型名)和 message(错误说明)两个属性。ECMAScript 内置了多种错误类型:
| 类型 | 含义 | 常见触发场景 |
|---|---|---|
| ReferenceError | 引用错误 | 使用未声明的变量 |
| TypeError | 类型错误 | 对 null/undefined 取属性 |
| RangeError | 范围错误 | 数值超出允许范围 |
| SyntaxError | 语法错误 | 代码本身写错,无法被捕获 |
最后提醒:try...catch 只能捕获同步代码里的错误;异步操作(定时器、网络请求)出错时要用后面的 Promise/async 章节介绍的方式处理。
小结
错误处理让程序更健壮:用 try...catch 捕获、用 throw 主动报告、用 finally 收尾;结合错误对象的 name 与 message,就能写出清晰易懂的报错信息。