我怎样才能"throw" "catch"被拒绝的承诺,由外部"catch"博克处理?



这很有效

function rejectedPromise() {
return Promise.reject("ERROR");
}
async function someFunction() {
try {
rejectedPromise()
.catch((err) => console.log(err));   // IT WORKS ! THE ERROR IS BEING LOGGED HERE
}
catch(err) {
console.log(err);
}
}
someFunction();


事实并非如此

function rejectedPromise() {
return Promise.reject("ERROR");
}
async function someFunction() {
try {
rejectedPromise()
.catch((err) => { throw err; });      // CAN'T I THROW HERE ?
}
catch(err) {
console.log(err);                     // DOES NOT WORK. THE ERROR SHOULD BE LOGGED HERE
}
}
someFunction();

问题

为什么?

注意:我的目标是throw来自被拒绝的Promise的catch方法的错误,throw它,所以它由外部catch块处理。不知道这是否重要,但这是在async函数内部发生的(如果我从示例中删除async关键字,它就不起作用(。

额外:

在Node中,我得到了这个(即使有一个捕获块(:

未处理的PromiseRejection警告:未经处理的promise rejection。这个错误要么是由于在没有catch块的异步函数内部抛出,要么是由于拒绝了未使用处理的promise.catch((。(拒绝id:1(

正如注释中所指出的,如果您在async函数中,则不需要使用.catch()。我不知道你为什么想要嵌套的try...catch,但看起来这会实现你想要的:

function rejectedPromise() {
return Promise.reject("ERROR");
}
async function someFunction() {
try {
try {
await rejectedPromise()
} 
catch(err) {
throw err;
}
}
catch(err) {
console.log(err);
}
}
someFunction();

最新更新