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

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

我在想这样的事情:

Future { throw Exception } zip Future { throw Exception } recover ...

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

【问题讨论】:

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

标签: scala sequence future recover


【解决方案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)
}

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

【讨论】:

    猜你喜欢
    • 2014-01-10
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 2013-04-27
    • 2018-11-28
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多