想使用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的原因。
若有错误敬请指出改正