【问题标题】:Node process exits even after error handling即使在错误处理后节点进程也会退出
【发布时间】:2022-12-12 02:55:09
【问题描述】:

我有这样的东西用 nodejs 写的

const someOtherOperation = async (message) => {
    try {
        await doSomeIoOperation(message);
    } catch (err) {
        something
        throw Error("Error doing someOtherOperation");
    } finally {
        await someCleanup();
    }

}


const someOperation = async (message) => {
    // something else
    await someOtherOperation(message);
    // something else
}

const main = async () => {
    let messagePromises = []
    let messages = await getMessages(); // fetching message from a message broker

    for (let message of messages) {
        messagePromises.push({ id: message.id, promise: someOperation(message) });
    }

    for (let messagePromise of messagePromises) {
        try {
            await messagePromise.promise;
        } catch (err) {
            console.log(err);
        }
    }

}

预期的行为是带有 try catch 的 for 循环不应该结束,即使其中一个承诺有错误。 发生的事情是当我在 someotherOperation 方法中遇到错误时我的进程突然结束,我不明白我在主循环中有一个 try catch 并且从最内层函数传播的任何错误都应该在主函数的 for 循环中被捕获但是它没有以某种方式被捕获并且该功能突然结束

【问题讨论】:

  • 添加 process.on("unhandledRejection") 的更新因上述代码而被解雇我不明白的是我的哪些承诺在这里未处理我已经特别注意处理所有承诺

标签: node.js async-await es6-promise


【解决方案1】:

Node.js 对未处理拒绝的检测不正确。在被拒绝的 promise 的生命周期中有特定的点,引擎会检查是否有处理程序,并且它并不总是等到最后可能的时刻,所以它可能会错过我们添加处理程序的地方。

在我的代码中,我创建了一堆没有任何错误/拒绝处理程序的承诺的地方

 messagePromises.push({ id: message.id, promise: someOperation(message) }); 

当我对第一个承诺执行第一个等待时,它返回被拒绝但在此期间考虑其他承诺也被拒绝,Nodejs 引擎检查是否有这些被拒绝的承诺的处理程序,如果没有处理程序则抛出错误。因此,即使我为这些 promise 添加了一个 try catch 以希望处理拒绝,nodejs 引擎已经对处理程序进行了检查,但没有人决定抛出未处理的 promise 拒绝。

为了解决我的代码风格,我所做的是

const main = async () => {
    let messagePromises = []
    let messages = await getMessages(); // fetching message from a message broker

    for (let message of messages) {
        messagePromises.push({ id: message.id, 
        promise: someOperation(message).then(data=>[data,null]).catch(err=>[null,err]);
    }

    for (let messagePromise of messagePromises) {
        const [data,err] = await messagePromise .promise;
        if(err) {
           //some error handling code here.
        }
    }

}

对于这样一个成熟的语言来说,这是一种非常奇怪的行为。

【讨论】:

    猜你喜欢
    • 2018-08-30
    • 2014-12-31
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多