一、为什么要捕获异常
众所周知,js是单线程语言,代码一旦报错,后面的代码就无法执行,此时需要给代码加上try catch,使得代码可以继续向后执行
加上try catch后
二、try catch是在什么时候捕获到异常
try catch运行机制:
- try catch是同步的
- 当程序运行到try中时,如果未报错,则忽略catch;如果报错,则不执行try中报错内容后面的代码,转而执行catch
1、语法错误时,无法捕获异常
原因:语法错误在语法检查阶段就报错了,此时都还没有运行代码,更没有走到try中,自然无法捕获异常
2、语法正确,程序运行到try中,此时异常可以捕获
三、try catch无法捕获异常的情况
1、异步无法捕获
原因:try catch是同步代码,等setTimeout中的代码进入到队列中时,此时主线程已经离开了try catch了,所以此时的报错是无法被try catch捕获到的
2、promise异常无法被try catch捕获
原因:promise中的异常只能被其自带的.catch捕获
四、如何捕获异步中的异常
1、捕获setTimeout中的异常
在异步操作中直接处理错误
2、捕获promise异常
方式一:
promise异常使用其自带的.catch来捕获
方式二:
如果需要使用try catch捕获promise异常,可以使用async await
不加async await时,promise执行完,在等待执行promise中的回调时,try catch已经执行完了;
加了async await时,try catch需要等待promise中的回调执行完才能往下走,所以被catch捕获到异常
注意这种情况:
因为异常被.catch捕获到了,到了try catch这层时,异常已经被捕获了
如果你觉得这篇文章对你有用,可以看看作者封装的库xtt-utils,里面封装了非常实用的js方法。如果你也是vue开发者,那更好了,除了常用的api,还有大量的基于element-ui组件库二次封装的使用方法和自定义指令等,帮你提升开发效率。不定期更新,欢迎交流~