不知道你是否和我一样,总是闻“错”色变,想要自己的代码完美无缺。但其实“错误”也是程序的一部分,学会如何驾驭错误,在合适的时机
抛出错误
,在适合的位置捕获错误
,对于代码水平提升非常重要
一、抛出错误
1 throw关键字的使用
使用throw
关键字来抛出错误信息,throw
可以理解为一种特殊的return
,可以抛出基本数据类型、对象等。抛出错误后,如果没有捕获错误的代码,主程序会立即终止执行。
- throw 基本数据类型
throw '错误信息';
throw 100;
- throw 自定义错误对象
class MyError {
constructor(errorCode, errorMessage) {
this.errorCode = errorCode;
this.errorMessage = errorMessage;
}
}
throw new MyError(-1001, '错误信息')
- throw 内置错误类(最常用)
最常见的是Error类,它有三个属性
- name:Error的名称,通常和类的名称一致;
- messsage:创建Error对象时传入的message;
- stack:整个Error的错误信息,包括函数的调用栈(方便debug)
Error类有三个子类:TypeError SyntaxError RangeError,分别表示类型错误、语法错误和边界错误
throw new Error('错误信息');
// 等价于
const error = new Error('错误信息');
throw error;
终端打印的错误对象解读
包括name、message、stack三部分
2 主动抛错的好处
函数对传入的参数进行类型校验,如果不符合要求,需要通过抛出错误来告诉使用者如何更正,而不是return之后继续执行
function sum(num1, num2) {
// 当传入参数不正确时,如果直接return undefined,调用者不知道内部发生了什么问题
// if(typeof num1 !== 'number' || typeof num2 !== 'number') return;
if (typeof num1 !== "number" || typeof num2 !== "number") {
throw new TypeError("传入参数必须为数字类型"); // return ->>throw 若未对错误进行处理,程序会中止
}
return num1 + num2;
}
二、捕获错误
如果我们在调用一个函数时,这个函数抛出了异常,但是我们并没有对这个异常进行处理,那么这个异常会继续传递到上一个函数调用中;如果到了最顶层(全局)的代码中依然没有对这个异常的处理代码,这个时候就会报错并且终止程序的运行。
很多情况下当出现异常时,我们并不希望程序直接退出,而是希望可以正确的处理异常
1 try-catch的使用
使用try-catch来捕获并处理错误,这样后续程序不会终止执行
- ES10后,catch可以无参数
- finally部分可有可无
try {
/*可能出错的代码*/
} catch (error) {
/*在这里对可能出现的错误进行处理*/
} finally {
/*无论是否报错,都会执行finally*/
}