重新抛出 promise catch 中的错误

新手上路,请多包涵

我在教程中找到了以下代码:

 promise.then(function(result){
    //some code
}).catch(function(error) {
    throw(error);
});

我有点困惑:catch 调用有什么作用吗?在我看来,它没有任何效果,因为它只是抛出了被捕获的相同错误。我基于常规 try/catch 的工作原理。

原文由 Tyler Durden 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 860
2 个回答

正如你所展示的那样,赤裸裸的接球和投掷是没有意义的。除了添加代码和减慢执行速度外,它没有做任何有用的事情。所以,如果你要 .catch() 并重新抛出,你应该在 .catch() 中做一些事情,否则你应该完全删除 .catch() .

该通用结构的通常点是当您想要在 .catch() 中执行某些操作时,例如记录错误或清理某些状态(如关闭文件),但您希望承诺链继续被拒绝。

 promise.then(function(result){
    //some code
}).catch(function(error) {
    // log and rethrow
    console.log(error);
    throw error;
});

在教程中,它可能只是为了向人们展示他们可以在哪里捕获错误或教授处理错误然后重新抛出错误的概念。


捕获和重新抛出的一些有用原因如下:

  1. 您想要 记录错误,但将承诺链保持为已拒绝。
  2. 您希望 将错误转化为其他错误(通常是为了在链的末端更容易地处理错误)。在这种情况下,您将重新抛出一个不同的错误。
  3. 您希望 在承诺链继续之前进行一系列处理(例如关闭/释放资源),但您希望承诺链保持拒绝状态。
  4. 如果出现故障,您希望在承诺链中的此时 为调试器放置一个断点
  5. 您想要 处理一个特定的错误或一组错误,但重新抛出其他错误,以便它们传播回调用者。

但是,在 catch 处理程序中没有其他代码的情况下,简单地捕获并重新抛出相同的错误对代码的正常运行没有任何用处。

原文由 jfriend00 发布,翻译遵循 CC BY-SA 4.0 许可协议

.then().catch() 方法都返回 Promises,如果您在任一处理程序中抛出异常,则返回的 promise 将被拒绝,并且异常将在下一个拒绝处理程序中被捕获。

在下面的代码中,我们在第一个 .catch() 中抛出异常,在第二个 .catch() 中被捕获:

 new Promise((resolve, reject) => {
    console.log('Initial');

    resolve();
})
.then(() => {
    throw new Error('Something failed');

    console.log('Do this'); // Never reached
})
.catch(() => {
    console.log('Something failed');
    throw new Error('Something failed again');
})
.catch((error) => {
    console.log('Final error : ', error.message);
});

第二个 .catch() 返回一个已实现的 Promised,可以调用 .then() 处理程序:

 new Promise((resolve, reject) => {
    console.log('Initial');

    resolve();
})
.then(() => {
    throw new Error('Something failed');

    console.log('Do this'); // Never reached
})
.catch(() => {
    console.log('Something failed');
    throw new Error('Something failed again');
})
.catch((error) => {
    console.log('Final error : ', error.message);
})
.then(() => {
    console.log('Show this message whatever happened before');
});

有用的参考: https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises#Chaining_after_a_catch

希望这可以帮助!

原文由 Philippe Sultan 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏