try catch不能检测异步错误

192 阅读1分钟

try catch不能检测异步错误

1.无法监听setTimeout函数中的错误

2.无法监听promise函数中的错误

3.无法监听Ajax函数中的错误

try {
    throw new Error("异常1")

} catch (e) {
    console.log(e)
}
try {
    setTimeout(function () {
        throw new Error("异常2")
    }, 100)

} catch (e) {
    console.log(e)
}
输出:

在浏览器是分别输出Error: 3异常1(正常打印出错误实例,未报错)和 Uncaught Error: 异常2(一个未捕获错误)

Error: 异常1
    at index.html:44
index.html:51 Uncaught Error: 异常2
    at index.html:51

在《node.js深入浅出》中写到对异步方法进行try/catch操作只能捕获当次事件循环内的异常,对call back执行时抛出的异常将无能为力 。也就是说js对异步方法进行try/catch的时候是无法捕获当前事件循环内的异常的。

原因在于浏览器在执行javaScript的时候是以单线程的方式执行,但是javaScript里提供了异步操作,这些异步操作会被放入事件任务队列(event loop)中,比如定时器、promise、ajax。只有等主线程任务执行完毕后,任务队列才开始通知主线程,请求执行任务队列。而 try catch 能捕获到的仅仅是 try 模块内执行的同步方法的异常 。