捕获的NodeJS错误仍然传播吗?



我在两个地方捕获了一个错误,但是,它似乎进一步传播到我的套接字服务器上,杀死了它。下面是我的代码的不完整摘要。很抱歉没有提供一个真正的最小可复制的例子,我无法用简单的术语触发它。

外抓

import WebSocket from 'ws';
export const run = async (ws: WebSocket) => {
const executor = new Executor()

const execution = executor.execute()
try {
for await(const update of execution) {
ws.send(update.stringify())
}
} catch(error) {
console.log("Outer catch", error)
}
}

Executor (Inner catch)

class Executor {
async *execute() {
const promise = generator.next()
// Handle run error
promise.catch((error: Error) => {
console.log("Inner catch", error) 
})
}
}

结果(错误顺序)

Log: "Inner catch", <THE_SAME_ERROR>
Log: "Outer catch", <THE_SAME_ERROR>!!
Error: <THE_SAME_ERROR>!!!
[nodemon] app crashed

发生这种情况的原因是什么?

编辑

我是故意写这个错误的,就像

一样简单
throw Error('Some message')

这个错误将在上面的generator.next()中抛出,它返回一个我不等待的承诺。因此,我在后面注册catch回调。

是否可以尝试将try/catch范围扩展到:

export const run = async (ws: WebSocket) => {
try {
const executor = new Executor();
const execution = executor.execute();
for await (const update of execution) {
ws.send(update.stringify());
}
} catch (error) {
console.log("Outer catch", error);
}
};

可能会分享一些错误信息的上下文

不是我的问题的完整答案,我不明白为什么,但我可以通过链接thencatch来解决我的问题。比较这些例子:

失败
(async () => {
// The async generator
const computer = async function *run() {
throw Error('Some error!')
}
// Initialize the generator
const runner = computer()
// Store reference to the promise
const promise = runner.next()
// Handle success
promise.then(() => {
console.log("Handle success")
})
// Handle fail    
promise.catch((error: Error) => {
console.log("Catch", error)
});
// Await Error/Success
await promise;
})();
成功

(async () => {
// The async generator
const computer = async function *run() {
throw Error('Some error!')
}
// Initialize the generator
const runner = computer()
// Use chaining!
const promise = runner.next()
.then(() => {
console.log("Handle success")
})
.catch((error: Error) => {
console.log("Catch", error)
});
// Await Error/Success
await promise;
})();

相关内容

  • 没有找到相关文章

最新更新