「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」 摘要:本文主要讲了javascript中的错误如何处理,try/catch/finally使用,常见错误类型,自定义错误实现及throw,还有与window.onerror函数之间的关系。
1.try,catch,finally使用
在javascript中,错误处理的方式是,对try代码块中,是可能会发生错误的代码,catch中是处理错误的代码, finally中是无论有错误与否都执行的代码。在try代码块中,发生错误会停止执行,直接跳到catch代码块执行, catch接受一个参数为此次错误的错误类型,有name和message属性,用于表示该错误消息。finally是可选代码 块,只要有,就会按照顺序依次执行到finally。 示例代码如下,其中eee没有所引用的对象,会抛出ReferenceError错误。
let a = 123;
try {
a = eee;
console.log("发生错误后面的代码")
} catch (error) {
console.log(error.name+"---"+error.message);
}finally{
console.log('finally代码块')
}
/*输出结果为:
ReferenceError---eee is not defined
finally代码块
*/
2.常见错误error
一般的错误类型对象都继承自根错误Error类,所以这些错误都有继承的相同的属性和方法,如name和message属性。 常见的错误类型有8种,在平时编码过程中都可能会遇到。
- Error,该类型主要用于开发者抛出自定义错误。
- InternalError,底层JavaScript引擎发生错误时会抛出。
- EvalError,错误的使用eval()函数时会抛出此错误。
- RangeError,数组索引越界时会抛出此错误。
- ReferenceError,顾名思义,不存在所引用的对象时会抛出此错误。
- SyntaxError,发生语法错误时会抛出,主要用于调用eval()函数时所传递的字符串参数里发生语法错误。在其它地方发生错误时,并不能catch到,此时程序会暂停,停止执行并打印出错误。
- TypeError,类型不对,属性不存在时,都会抛出此错误。
- URIError,调用decodeURI()和encodeURI()时传入格式错误的URI时会抛出。 注意,有时候因为不同浏览器对同一个错误可能会输出不同的message,所以我们最好使用instanceof判断属于哪一类型 错误并做出处理错误的操作。
3.自定义错误类型和throw
我们也可以自己定义错误类型去实现自定义抛出错误,该类型需要继承Error类,并初始化name和message属性。示例代码如下,当符合a>b时,我们使用throw去抛此错误。
class e1 extends Error{
constructor(message){
super(message);
this.name = "e1";
this.message = message;
}
}
let a = 100, b = 50;
try {
if(a>b)
throw new e1("a大于b");
} catch (error) {
console.log(error.name+"---"+error.message);
}
/*输出结果为:
e1---a大于b
*/
4.window.onerror与错误之间的关系
javascript中发生了任何未被catch的错误,都会触发error事件,根据浏览器不同, 程序可能会暂停运行或继续运行,所以如果我们需要程序继续运行的话,error事件返回为true即可。示例代码如下:
<!DOCTYPE html>
<head>
<script type="text/javascript">
window.onerror = (message, url, line) => {
console.log("自定义消息");
return true;
};
try {
let a = e;
} catch (error) {
alert("123");
}
let a = e;
alert("123");
</script>
</head>
<body></body>