天天看点

try……catch的异常捕获机制一,try,catch的运行机制二,什么时候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的异常捕获机制一,try,catch的运行机制二,什么时候try catch 才能捕获到异常?