【问题标题】:How to throw an exception in a Promise catch block? (Unhandled promise rejection)如何在 Promise catch 块中抛出异常? (未处理的承诺拒绝)
【发布时间】:2021-04-28 10:18:05
【问题描述】:

我有多个返回 Promise 的函数。如果出现错误,他们会使用reject。但我想处理 Promise.all() 调用的 catch 块中的错误。但是在运行时会导致Unhandled promise rejection

function errorFunc() {
    return new Promise((_, reject) {
    reject('rejected in errorFunc')
  })
}

Promise.all([
    errorFunc(),
]).catch(reasons => {
    //throw new Error('an error occured', reasons)
  console.log('an error occured')
})

如您所见,console.log 工作正常,但在抛出异常时运行失败。 我已经阅读了多篇关于未处理的承诺拒绝的文章和主题,但我还没有找到解决该问题的方法。

这是 JSFiddle 上的失败代码:https://jsfiddle.net/qkptbjnz/1/

我该如何解决这个问题?或者您对更好的错误处理有什么建议?

编辑我想在这里实现某种验证:https://jsfiddle.net/89d5nLcw/

【问题讨论】:

  • 您的目标是什么?您可以处理 catch 中的错误,这是预期的方式。无需重新抛出错误
  • @JensV 我有一个“validateObject”函数,它异步调用多个其他验证函数。当一切都完成后,如果其中一个失败,我想抛出一个异常。
  • @JensV jsfiddle.net/89d5nLcw 这个主意不错
  • 它就像try/catch 一样工作:当你重新throw 来自catch 块的异常时,你将不得不在其他地方再次捕获它,或者你的程序崩溃。

标签: javascript node.js typescript promise


【解决方案1】:

好吧,你不应该在 catch 部分抛出错误,这个块是用来处理错误的。

function errorFunc() {
    return new Promise((_resolve, reject) => {
    reject('rejected in errorFunc');
  });
}

Promise.all([
  errorFunc(),
]).catch(error => {
 console.log('an error occured', error);
})
像这里你可以看到你在上面抛出的消息。

【讨论】:

  • 是的,但我对错误的处理在上面一层。我尝试的是运行多个验证函数并以简单的方式捕获所有错误。之后,如果发生任何错误,我想抛出另一个错误。尽管此处发生错误,但 Jus 打印将继续程序。
  • 这更接近我想要实现的目标:jsfiddle.net/89d5nLcw
  • 好的,我不确定,似乎你出于某种原因尝试两次捕获相同的错误。 Promise.all 如果发生什么事情会抛出一个错误,你不必立即捕捉它。只要确保你的“上面的层”会抓住它,仅此而已。
  • 好的,谢谢。我想我得重新考虑我的结构了。
  • 好吧。我只能补充的是,您无需捕获错误即可再次抛出它。只是在你需要它之​​前不要抓住它=)
猜你喜欢
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 2019-02-28
  • 2018-03-17
  • 2020-03-22
  • 1970-01-01
  • 2017-06-04
  • 2020-07-08
相关资源
最近更新 更多