JS 关于setTimeout不能使用throw抛出异常问题记录

想使用setTimeout做一个超时抛出错误,结果发现不能用

测试代码

async function test(){
    console.log('---------1');
    let loop = true;
    const time = setTimeout(() => {
        loop = false;
        console.log('---------2');
        throw new Error('timeout');
    }, 1000);
    console.log('---------3');
    while(loop){
        console.log('---------4');
        await new Promise(resolve => {
            setTimeout(() => resolve(), 500);
        })
    }
    console.log('---------5'); // 执行不到这里
    throw new Error('normal Error');
}

async function main(){
    try{
        await test();
    }catch(err){
        console.log(err.message); // 无法捕获setTimeout中的throw
    }
}

main();

throw语句只报错而不能被捕获

执行结果

---------1
---------3
---------4
---------4
---------2
C:\Users\admin\Desktop\test\test.js:95
        throw new Error('timeout');
        ^

Error: timeout ...

想了想,setTimeout中回调方法的上下文并不在当前代码中

setTimout中传入的回调方法应该是被js引擎直接调用的,而引擎直接发出的报错,这可能就是捕获不到throw的原因。

 

若有错误敬请指出改正

参考资料

  1. js执行机制(Promise以及setTimeout)以及Promise中对throw new error()的捕获
  2. js中setTimeout导致try catch无法捕获异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值