我读了一篇内容非常丰富的博客(作者:PANU PITKÄMÄKI),内容是关于为什么异步异常在 NodeJS 中无法追踪的。它指出,在 NodeJS 中,异步异常是无法追踪的,因为
catch
块根本不存在于事件循环的堆栈中。例如:
try {
setImmediate(() => {
throw new Error();
});
} catch (e) {
// catch error.. doesn't work
}
我还在《NodeJS设计模式》一书中阅读了以下内容:
抛出异步回调将导致异常跳转到事件循环,并且永远不会传播到下一个回调。在 NodeJS 中,这是一种不可恢复的状态,并会导致应用程序关闭。
从书中我得到的印象是事件循环有一个单独的堆栈,因此有一个单独的线程,这是真的吗?
这是很符合逻辑的,你确实无法捕获异步调用中抛出的异常。捕获它的最简单方法可能是使用
await
调用,但它可能会破坏异步机制的目的。要查看一些替代方案,请参阅这个旧的 Stackoverflow 答案。