使用 async wait 捕获异常并避免 unhandledRejection

问题描述 投票:0回答:1

我有一个更大的用例,我将其缩小到以下代码片段。 这段代码可能没有多大意义,但这只是为了演示我遇到的问题。 我试图捕获函数抛出的异常(下面称为 throwFunction)。 我想调用该函数,但不等待它完成,即使它返回一个承诺。 调用该函数后,我立即调用另一个异步函数(waitALittle)。 我希望能够捕获 try catch 中的任何异常。 我看到的问题是我似乎无法捕获抛出的错误并获得 unhandledRejection 。 我尝试用 try catch 包围几乎每一段代码,但没有任何效果。我总是遭到未经处理的拒绝。 下面是您看到 unhandledRejection 发生在 waitFunction 的开始和结束之间的输出,这似乎是问题的核心,当抛出异常而另一个函数仍未解决其承诺时。

问题。

  1. 为什么会发生这种情况,为什么 try catch 不阻塞,捕获异常。
  2. 如何解决这个问题。
const setTimeout = require ('timers/promises').setTimeout;

async function waitALittle(){
    await setTimeout(100);
}

async function throwFunction(a){
//do some stuff...
throw new Error('test');
}

async function f(){
    try {
        throwFunction();
        console.log('wait started')
        await waitALittle();
        console.log('wait ended')
    }catch(e) {
        console.log('exception caught');
    }
}

process.on('unhandledRejection', ()=>{
    console.log('unhandledRejection event');
})

f();

输出:
等待开始
“未处理的拒绝事件”
等待结束

我尝试用 try catch 覆盖代码的许多部分,但没有捕获异常,并且我继续收到 unhandledRejection。

node.js async-await promise try-catch
1个回答
0
投票

您在拨打

await
之前错过了
throwFunction

async function f(){
    try {
        await throwFunction(); // <<< here
        console.log('wait started')
        await waitALittle();
        console.log('wait ended')
    }catch(e) {
        console.log('exception caught');
    }
}

如果没有它,该函数将与其余代码并行异步运行。它抛出的错误导致同步

throwFunction()
调用返回的承诺最终被拒绝。但是,您不会将该承诺用于任何事情,特别是没有调用
.catch
(甚至没有隐式使用
await
),因此拒绝未得到处理。

© www.soinside.com 2019 - 2024. All rights reserved.