使用Scala Future的异常处理失败方案

时间:2017-09-04 20:21:03

标签: scala future

我有以下测试方法

def test() = {
val aa = Future{10} map {
  case x if x%2 == 0 => (x,x)
  case _ => val kk = Future.failed(BadRequestException("dd")); kk
 }
 aa
}

如果删除case _,则返回类型的方法为Future[(Int, Int)],这正是我想要的。但是,当我添加case _方案时,返回类型变为Future[Object]。我无法理解我应该更改什么,因为我们的代码库中的其他类似方法做类似的事情(我确信我遗漏了一些微妙的东西)并且返回类型仍然是自然Future[(Int, Int)]。毕竟,当我为场景抛出异常时,我不希望改变方法的返回类型。我错过了什么或做错了什么?

1 个答案:

答案 0 :(得分:3)

您应该使用flatMap代替map,如下所示。使用map方法,case _的返回类型为Future[BadRequestException],而case x if x%2 == 0的返回类型为(Int, Int)。这导致您的净回报类型为Future[Object]。这可以通过使用flatMap而不是map来更正,如下所示。

def test() = Future{10} flatMap {
  case x if x%2 == 0 => Future.successful((x,x))
  case _ => Future.failed(BadRequestException("dd"))
 }