我在两个地方捕获了一个错误,但是,它似乎进一步传播到我的套接字服务器上,杀死了它。下面是我的代码的不完整摘要。很抱歉没有提供一个真正的最小可复制的例子,我无法用简单的术语触发它。
外抓
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);
}
};
可能会分享一些错误信息的上下文
不是我的问题的完整答案,我不明白为什么,但我可以通过链接then
和catch
来解决我的问题。比较这些例子:
(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;
})();