Promise 和 async/await 的异常处理

//例子1
function getList(){
    return new Promise((rs,rj)=>{
        rj('假装发生了错误')
    })
}
try{
    getList();
}
catch(e){
    alert('遇到了些许错误哦~')
}

打开控制台会发现,上面的例子将会抛出 Uncaught (in promise)异常。

未捕获异常的原因 例子中的Promise异常未被正常捕获,是因为promise虽然出现在try…catch…中,但是并没有被await,如此将不进入上述的异常捕获流程,一旦出现异常并且没有其它有效的catch时,就将抛出至全局。

Promise创建时需要传入一个function,在这个function执行过程中,如果出现了异常则会对外抛出。外部有2种方式来捕获这个异常:

方式一:catch()
let promise = new Promise(...);
promise.catch(e=>{
    // TODO sth with e
})
方式二:async/await中的try...catch...
let promise = new Promise(...);
async function test(){
    try{
        await promise;
    }
    catch(e){
        // TODO sth with e
    }
}

如果这两种方式都没有出现,则异常将会被视为 “Uncaught (in promise)” 被抛出到全局去。在NodeJS中,你可以通过process.on(‘unhandledRejection’, e => {…})来捕获全局异常。遗憾的是,在浏览器中,尚未发现有效的方式能捕获此类全局异常。所以应当极力避免出现全局异常的情况,尤其是在前端,可能由异常导致流程中断。
只要Promise的异常被方式一或方式二捕获,就不会抛出全局异常

修改例子1

function getList(){
    return new Promise((rs,rj)=>{
        rj('假装发生了错误')
    })
}

async function main(){
    try{
        getList();
    }
    catch(e){
        alert('遇到了些许错误哦~')
    }
}

main();

依旧不能正常工作!因为 Promise 虽然出现在了 async 方法中,但由于没有被 await,所以其异常视为全局异常。


new Promise(rs=>{
    throw new Error('Error')
}).catch(e=>{
    console.log('异常被捕获到了1')
})

new Promise(async rs=>{
    throw new Error('Error')
}).catch(e=>{
    console.log('异常被捕获到了2')
})

第一个 Promise 里的异常能被捕获,因为 Promise 里同步抛出的异常,也会被视为Promise.reject。但第二个 Promise,由于里面的函数是 async 的,异常是异步抛出的,所以并不会触发 Promise 的 reject ,因此 Promise.catch 也就捕获不到。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值