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,就能写出清晰易懂的报错信息。

笔记加载中…