感谢亿速云一篇有用的文章:www.yisu.com/zixun/72201…
首先要明确try catch只能捕获同步代码,不能捕获异步代码。
// 这段代码捕获不到错误
try {
setTimeout(() => {
throw Error('出错了')
})
} catch (error) {
console.log('这里不会被执行')
}
// 改为同步代码就可以了
try {
throw Error('出错了')
} catch {
console.log('会被执行')
}
Promise有自己的错误处理回调函数,也就是then方法的第二个参数。
Promise.reject('error').then(() => {
console.log('我不会被打印')
}, () => {
console.log('会被打印')
})
我们一般不会这么写。因为try catch捕获不到错误,Promise自己会处理错误。
try {
Promise.reject('error').then(() => {
console.log('我不会被打印')
}, () => {
console.log('会被打印')
})
} catch (error) {
// ...
console.log('不会执行')
}
但是如果我们使用async、await,就没有类似then方法的第二个参数了。
try {
await Promise.reject('error')
} catch (error) {
// ...
console.log('会执行')
}
await 后面的值如果是一个Promise,会等它的状态改变,如果为成功状态,返回成功的值。如果为失败状态,会被try catch所捕获。
await 后面的值如果是非Promise,则直接返回该值。
综上所述,处理Promise的异常捕获,可以再Promise实例的then方法第二个参数里捕获,也可以利用async await配合try catch捕获。