我有一个异步函数,我希望它在失败时抛出异常。然而,似乎有些事情阻止了这一点:
通过省略 try catch 块,我希望抛出一个我想在函数外部处理的异常。
我得到的实际结果有些混乱:
(node:10636) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): E11000 duplicate key error index.
(node:10636) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
async f(obj) {
await db.collection('...').save(obj);
}
当我尝试捕获异常并抛出其他东西时,我得到了相同的结果:
async f(obj) {
try {
await db.collection('...').save(obj);
} catch(e) {
throw e.message;
}
}
该函数是从 try 块中调用的,所以看不出这是一个 Unhandled Promise。
我正在尝试使用 f
作为另一个函数的参数:
g(obj, handler) {
try {
handler(obj);
} catch(e);
...
}
}
g(objToSave, f);
原文由 user1063963 发布,翻译遵循 CC BY-SA 4.0 许可协议
最终,您要做的是在同步函数
f
中调用异步函数g
,这是行不通的(这相当于能够打开一个异步函数转换为同步函数)。相反,
g
也必须是async
,或者它应该正确处理f
返回的承诺。但是, 在此评论中, 您声明由f
表示的函数可能并不总是返回承诺,在这种情况下,前一个选项最容易实现:如果
handler
不返回承诺,而只是一个值(记录 在此处),这也将起作用。调用
g
(再次)需要异步函数或代码来处理其返回的承诺: