LOADING

异常

2023/9/23

异常并非坏事,它可以让开发人员及时发现错误、定位错误,甚至在某些时候,我们还需要故意的抛出异常

异常的分类

在 JS 中,异常表现为一个对象,不同的对象表达了不同的异常类型,不同类型的异常对应到不同的错误

异常类型 含义
SyntaxError 语法错误
ReferenceError 引用错误,往往是使用了未定义的变量或函数
TypeError 类型错误,往往是使用了一个对象中不存在的成员

每个异常都是一个对象,通过对应的构造函数创建

所有的异常构造器都继承自 Error,更多信息参见MDN

当代码运行过程中出现错误时,JS 会:

  1. 自动创建对应的异常对象,抛出错误
  2. 程序终止运行
  3. 控制台中会显示异常对象

每个异常对象都至少记录了两个关键信息

  1. 错误消息描述:描述异常出现的原因
  2. 调用堆栈信息:描述异常出现的位置

捕获异常

捕获异常就是处理错误,当错误发生后,我们对错误进行相应的处理,让程序不至于终止

try {
  // 代码1
} catch (err) {
  // 代码2:当代码1出现异常后,会执行这里的代码,异常对象会传递给err
} finally {
  // 代码3:可省略。无论是否有异常,都会执行
}

// 无异常的执行顺序:代码1 --> 代码3
// 有异常的执行顺序:代码1 --> 出现异常,中断代码1的执行 --> 代码2 --> 代码3

在绝大部分时候,我们都无须捕获异常,除非满足以下要求:

  1. 我们能够预知某段代码会出现异常
  2. 我们知道出现异常后要做什么

上面的条件任意一个不满足,都不应该处理异常

永远不能为了不报错而捕获异常!

下面是一段可能使用异常捕获的伪代码

try {
  var heros = network.getHeros(); // 从网络获取王者荣耀英雄数据,得到英雄数组
  createHTML(heros); // 将数组生成HTML
} catch (err) {
  // 出现网络故障,给用户显示一个提示框
  showErrorDialog(
    "网络故障,请检查您的网络是否连接正常。故障原因:" + err.message
  );
}

手动抛出异常

不仅浏览器会自动给我们抛出异常,我们还可以手动的抛出异常

throw 异常对象; // 当代码运行到这里,会终止执行,抛出异常对象,效果和浏览器抛出的错误完全一样
throw new TypeError("抛出错误");
throw new Error("参数异常");

当编写函数时,如果满足下面三个条件,就可以选择抛出异常:

  1. 预知执行过程中可能会出现某种错误
  2. 浏览器不会抛出这个错误
  3. 该函数无法处理这个错误