赞
踩
参考文章(本博文前部分是这篇博客复制过来的,已验证其正确性):
https://blog.csdn.net/weixin_39850143/article/details/111346809
当程序运行到try catch里面时,如果未报错,则忽略catch中的代码,若报错,则不执行try报错内容后面的代码,转而执行catch中的代码。
能捕捉到的异常必须是线程执行已经进入 try catch 但 try catch 未执行完的时候抛出来的
因为语法错误是在语法检查阶段就报错了,线程执行尚未进入 try catch 代码块,自然就无法捕获到异常。
例如:
try{
a.
}catch(e){
console.log("error",e);
}
// output
Uncaught SyntaxError: Unexpected token '}'
function d(){a.b;}
try{
d();
}catch(e){
console.log("error",e);
}
// output
error ReferenceError: a is not defined
代码执行进入了 try catch ,执行 d() 方法的时候,线程执行处在 try 里面,所以能捕捉到。
try{
setTimeout(()=>{
console.log(a.b);
}, 100)
}catch(e){
console.log('error',e);
}
console.log(111);
//output
111
Uncaught ReferenceError: a is not defined
因为,setTimeout是异步函数,而try catch其实是同步顺序执行的代码,等setTimeout里面的事件进入事件队列的时候,主线程已经离开了try catch,所以try catch是无法捕获异步函数的错误的。
事实上,Promise 的异常都是由 reject 和 Promise.prototype.catch 来捕获,不管是同步还是异步,try catch 无法捕捉 Promise 的异常,是因为 Promise 的异常没有往上抛。
也就是说,try catch无法捕获promise对象的错误。
那我们平时如何捕获promise的错误呢?使用await!将代码执行停留在 try catch 代码块里面。增加这个关键字之后,就把promise对象resolve成结果了,不再是promise对象。并且在try catch中,于是才可以捕获到错误。
例如:
多层 try-catch 时,会被最内层的 catch()方法捕获到,然后就不再向外层冒泡:
try {
try {
throw new Error('error');
} catch (err) {
console.error('内层的catch', err); // 内层的catch Error: error
}
} catch (err) {
console.error('最外层的catch', error);
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。