javascript - Catch 块包装了一个在未执行的 setTimeout 内抛出的函数
问题描述
最近经历了一些奇怪的事情,没有一个 catch 块被执行:
function funcWillThrow() {
try {
setTimeout(() => {
throw "Has thrown";
}, 3000);
} catch (error) {
console.log(error)
}
}
function caller() {
funcWillThrow();
}
caller();
和
function funcWillThrow() {
setTimeout(() => {
throw "Has thrown";
}, 3000);
}
function caller() {
funcWillThrow();
}
try {
caller();
} catch (error) {
console.log(error);
}
根据mdn 文档
当前函数的执行将停止(throw 之后的语句不会被执行),控制权将传递给调用堆栈中的第一个 catch 块。如果调用函数之间不存在 catch 块,则程序将终止。
我的猜测是调用堆栈发生了一些事情,如文档中所述。关于可能发生的事情的任何想法。
解决方案
setTimeout
稍后(在您的特定代码中 3 秒后)调用提供的函数,到那时调用的函数setTimeout
早已终止。
要在以后的函数中捕获异常,请将错误处理放在该函数中:
function funcWillThrow() {
setTimeout(() => {
try {
throw "Has thrown";
} catch (error) {
console.log(error);
}
}, 3000);
}
根据您在下面的评论,您可能正在寻找 Promises。由于该操作是异步的,并且发生在调用它的堆栈之外,因此为了捕获该堆栈中的错误,您需要等待该操作。理想情况下,您会利用reject
. Promise
像这样的东西:
function funcWillThrow() {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject("Has thrown");
}, 3000);
});
}
(async () => {
try {
await funcWillThrow();
} catch (err) {
console.log(err);
}
})();
如果您特别需要能够从回调中抛出setTimeout
,您也需要在那里捕获:
function funcWillThrow() {
return new Promise((resolve, reject) => {
setTimeout(() => {
try {
throw "Has thrown";
} catch (error) {
reject(error);
}
}, 3000);
});
}
(async () => {
try {
await funcWillThrow();
} catch (err) {
console.log(err);
}
})();
或者setTimeout
将自身自定义为 aPromise
并使用正常的错误处理:
function myTimeout(ms) {
return new Promise(function(resolve) {
setTimeout(resolve, ms);
});
}
(async () => {
try {
await myTimeout(3000).then(() => {
throw "Has thrown";
});
} catch (err) {
console.log(err);
}
})();
推荐阅读
- android - Unity 屏幕有时会在 android 中冻结,有时可以完美运行,而在编辑器中一切正常
- python - 从 -x 到 +x 的solve_ivp
- postgresql - 如何查找当前时区 EST 或 EDT
- css - 为什么将 ::content 更改为 ::slotted(..) 不起作用?
- c++ - std::map::size_type 用于其 value_type 是它自己的 size_type 的 std::map
- python - 神圣 - 将所有参数作为一个传递
- azure - 在 Azure 虚拟机之间共享具有用户权限的驱动器
- python-3.x - 更新本地包内的数据集
- java - 当我期望它时,CORS 的 Spring 实现不会拒绝消息
- javascript - PHP:在没有 JSON 的情况下将二维数组保存在数据库中