Scala通过一系列期货捕获抛出的错误

时间:2016-04-06 15:30:34

标签: scala sequence future recover

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

我想的是:

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

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

1 个答案:

答案 0 :(得分:2)

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

  

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

     

如果this未来失败,则生成的未来将失败   throwable存储在this中。 否则 ,如果that未来失败,则为   存储在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)
}

(我还没有对此进行过测试,但你明白了这一点)