gpt4 book ai didi

javascript - 如何从异步函数中抛出异常

转载 作者:IT老高 更新时间:2023-10-28 22:59:33 28 4
gpt4 key购买 nike

我有一个异步函数,我希望在失败时抛出异常。然而,似乎有些东西阻止了这一点:

通过省略 try catch block ,我希望抛出一个我想在函数之外处理的异常。

我得到的实际结果有些困惑:

(node:10636) UnhandledPromiseRejectionWarning: UnhandledPromiseRejectionWarning: Unhandled Promise Rejection (rejection id: 1): E11000 duplicate key error index。

(node:10636) DeprecationWarning:不推荐使用未处理的 promise 拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。

async f(obj) {
await db.collection('...').save(obj);
}

当我 try catch 异常并抛出其他东西时,我得到了相同的结果:

async f(obj) {
try {
await db.collection('...').save(obj);
} catch(e) {
throw e.message;
}
}

该函数是从一个 try block 中调用的,所以看不出这是一个 Unhandled Promise。

我正在尝试使用 f 作为另一个函数的参数:

g(obj, handler) {
try {
handler(obj);
} catch(e);
...
}
}

g(objToSave, f);

最佳答案

async f(obj) {
try {
await db.collection('...').save(obj);
} catch(e) {
throw e.message;
}
}

The function is called from a try block, so don't see how this is an Unhandled Promise.

这里未处理的是拒绝 f() 函数返回的 promise ,而不是 .save() 方法。所以这不会导致这个问题:

async f(obj) {
try {
await db.collection('...').save(obj);
} catch(e) {
console.error(e.message);
}
}

在异步函数中抛出异常总是拒绝由该函数返回的 promise

要捕获异常,您必须在另一个异步函数中执行此操作:

try {
asyncFunc();
} catch (err) {
// you have the error here
}

或者您可以显式添加拒绝处理程序:

asyncFunc().catch(err => {
// you have the error here
});

如果您捕获异常并抛出另一个异常,那么您会遇到同样的问题,只是在不同的函数中。

您要么必须添加一个 Promise 拒绝处理程序并且不抛出异常或返回一个被拒绝的 Promise,要么在另一个处理异常的异步函数中运行该函数,而不是重新抛出相同或新的异常。

总结一下:每个async 函数都会返回一个promise。每个 Promise 都需要有一个拒绝处理程序。

使用两个函数.then().catch()try { await asyncFunction(); 添加拒绝处理程序} 捕捉(错误){ ... }

当您有一个没有拒绝处理程序的 promise 拒绝时,您将在旧版本的 Node 中收到警告,在新版本的 Node 中收到 fatal error - 有关更多详细信息,请参阅此答案:

关于javascript - 如何从异步函数中抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42926390/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com