前言:在代码编写过程中,最常遇到的就是程序异常。其实异常并非坏事,它可以让开发人员及时发现、定位到错误,提醒我们做正确的事情,甚至在某些时候,我们还会手动抛出异常。
1.异常的分类
在JS中,异常表现为一个对象,不同的对象表达了不同的异常类型,不同类型的异常对应的是不同的错误,以下列举了几个最常见的异常类型:
异常类型 | 含义 | 例子 |
---|---|---|
SyntaxError | 语法错误 | |
ReferenceError | 引用错误,往往是引用了未定义的变量或函数 | |
TypeError | 类型错误,往往是使用了一个对象中不存在的成员 |
从例子中可以看出每个异常对象都至少记录了两个关键信息:
- 错误信息描述:描述异常出现的原因
- 调用位置信息:描述异常出现的位置
2. 捕获异常
捕获异常就是处理错误,当错误发生后,我们对错误进行相应的处理,让程序不至于因为某部分代码报错而终止,导致页面卡死或者崩溃(白屏)。
try {
// 代码1
}
catch(error) {
// 代码2:当代码1出现异常后,会执行这里的代码,异常对象会传递给参数error
}
finally {
// 代码3: 可以省略不写,因为无论是否有异常都会执行这里的代码
}
// 无异常的执行顺序:代码1 --> 代码3
// 有异常的执行顺序: 代码1 --> 出现异常,中断代码1的执行 --> 执行代码2 --> 执行代码3
在绝大部分时候,我们都无须捕获异常,除非已经预知到某段代码在某些场景下会出现异常,并且我们知道出现异常后要做些什么。
例如:当网络断线或者服务器宕机时,接口响应报错,捕获到错误之后给用户弹出友好性的提示语。
3. 手动抛出异常
不仅浏览器会自动给我们抛出异常,我们也可以手动的抛出异常
throw 异常对象; // 当代码运行到这里,会终止执行,同时抛出异常对象,显示效果和浏览器抛出的错误一样
下面举例一个需要抛出异常的场景:
/**
* 得到两个数字之和
* 若传参不是数字,则抛出TypeError
* @param {number} a 数字1
* @param {number} b 数字2
* @return {number} 两数之和
*/
function sum(a, b) {
if (typeof a != "number" || typeof b != "number") {
throw new TypeError("必须传入两个数字才能求和");
}
return a + b;
}
⚠️注:如果某个函数需要抛出异常,最好在文档注释中阐述原因。