面试官:使用try...catch捕获promise异常?

1,633 阅读2分钟

一、为什么要捕获异常

众所周知,js是单线程语言,代码一旦报错,后面的代码就无法执行,此时需要给代码加上try catch,使得代码可以继续向后执行

image.png

加上try catch后

image.png

二、try catch是在什么时候捕获到异常

try catch运行机制:

  1. try catch是同步的
  2. 当程序运行到try中时,如果未报错,则忽略catch;如果报错,则不执行try中报错内容后面的代码,转而执行catch

1、语法错误时,无法捕获异常

image.png

原因:语法错误在语法检查阶段就报错了,此时都还没有运行代码,更没有走到try中,自然无法捕获异常

2、语法正确,程序运行到try中,此时异常可以捕获

image.png

三、try catch无法捕获异常的情况

1、异步无法捕获

image.png

原因:try catch是同步代码,等setTimeout中的代码进入到队列中时,此时主线程已经离开了try catch了,所以此时的报错是无法被try catch捕获到的

2、promise异常无法被try catch捕获

image.png

原因:promise中的异常只能被其自带的.catch捕获

四、如何捕获异步中的异常

1、捕获setTimeout中的异常

在异步操作中直接处理错误

image.png

2、捕获promise异常

方式一:

promise异常使用其自带的.catch来捕获

image.png

方式二:

如果需要使用try catch捕获promise异常,可以使用async await

image.png

不加async await时,promise执行完,在等待执行promise中的回调时,try catch已经执行完了; 加了async await时,try catch需要等待promise中的回调执行完才能往下走,所以被catch捕获到异常

注意这种情况:

image.png

因为异常被.catch捕获到了,到了try catch这层时,异常已经被捕获了

如果你觉得这篇文章对你有用,可以看看作者封装的库xtt-utils,里面封装了非常实用的js方法。如果你也是vue开发者,那更好了,除了常用的api,还有大量的基于element-ui组件库二次封装的使用方法和自定义指令等,帮你提升开发效率。不定期更新,欢迎交流~