try……catch的异常捕获机制

参考文章(本博文前部分是这篇博客复制过来的,已验证其正确性):
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中,于是才可以捕获到错误。
例如:
try……catch的异常捕获机制_第1张图片

二,多层 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);
}

你可能感兴趣的:(#,element,ui后台管理系列,JS,前端)