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