参考文章(本博文前部分是这篇博客复制过来的,已验证其正确性):
https://blog.csdn.net/weixin_39850143/article/details/111346809
一,try,catch的运行机制
当程序运行到try catch里面时,如果未报错,则忽略catch中的代码,若报错,则不执行try报错内容后面的代码,转而执行catch中的代码。
二,什么时候try catch 才能捕获到异常?
能捕捉到的异常必须是线程执行已经进入 try catch 但 try catch 未执行完的时候抛出来的
1,当语法错误时,不能捕获
因为语法错误是在语法检查阶段就报错了,线程执行尚未进入 try catch 代码块,自然就无法捕获到异常。
例如:
try{
a.
}catch(e){
console.log("error",e);
}
// output
Uncaught SyntaxError: Unexpected token '}'
2,语法正确,线程进入try catch中时,可以捕获
function d(){a.b;}
try{
d();
}catch(e){
console.log("error",e);
}
// output
error ReferenceError: a is not defined
代码执行进入了 try catch ,执行 d() 方法的时候,线程执行处在 try 里面,所以能捕捉到。
3,异步无法捕获
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是无法捕获异步函数的错误的。
4,promise对象无法捕获
事实上,Promise 的异常都是由 reject 和 Promise.prototype.catch 来捕获,不管是同步还是异步,try catch 无法捕捉 Promise 的异常,是因为 Promise 的异常没有往上抛。
也就是说,try catch无法捕获promise对象的错误。
那我们平时如何捕获promise的错误呢?使用await!将代码执行停留在 try catch 代码块里面。增加这个关键字之后,就把promise对象resolve成结果了,不再是promise对象。并且在try catch中,于是才可以捕获到错误。
例如: