Scala 捕获一系列期货引发的错误

Posted

技术标签:

【中文标题】Scala 捕获一系列期货引发的错误【英文标题】:Scala catch thrown errors by a sequence of futures 【发布时间】:2016-07-27 03:00:27 【问题描述】:

是否可以在给定期货列表的情况下异步捕获所有错误?

我在想这样的事情:

Future  throw Exception  zip Future  throw Exception  recover ...

但我只在恢复部分收到一个 Throwable。有什么想法吗?

【问题讨论】:

你能在压缩它们之前为Future添加恢复吗? 我正在展示一个简化的示例。这就是我实际所做的,但问题是我想结合所有失败的期货抛出的异常。 【参考方案1】:

zip 的docs 明确表示它更喜欢来自this 的错误而不是来自that 的错误(我的重点):

def zip[U](that: Future[U]): Future[(T, U)] 压缩this 的值 和that 未来,并创建一个新的未来持有他们的元组 结果。

如果 this 未来失败,则生成的未来将失败,并 throwable 存储在this 中。 否则,如果 that 未来失败,则 生成的 future 因存储在 that 中的 throwable 而失败。

您可以实现自己的函数将两个期货组合成Future[(Try[T], Try[U])],例如:

def zipToTry[T,U](a: Future[T], b: Future[U])
                 (implicit executor: ExecutionContext)
    : Future[(Try[T], Try[U])] = 

  val t: Try[T] = a.map  Success(_) .recover  Failure(_) 
  val u: Try[U] = b.map  Success(_) .recover  Failure(_) 
  t.zip(u)

(我还没有测试过,但你明白了)

【讨论】:

以上是关于Scala 捕获一系列期货引发的错误的主要内容,如果未能解决你的问题,请参考以下文章

捕获 XHR 的 404 错误

捕获 XHR 的 404 错误

如何使用 XMLHttpRequest 捕获无效 URL 引发的错误

scala强制转换不兼容类型而不会引发错误

Spark/Scala - 项目从 IntelliJ 运行良好,但 SBT 引发错误

未捕获的错误:引发了跨域错误。 React 无法访问开发中的实际错误对象