【问题标题】:Exception handling with Scala Future failed scenarioScala Future 失败场景的异常处理
【发布时间】:2017-09-04 20:21:03
【问题描述】:

我有以下测试方法

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)]。毕竟,当我为某个场景抛出异常时,我不希望更改方法的返回类型。我错过了什么或做错了什么?

【问题讨论】:

    标签: scala future


    【解决方案1】:

    您应该使用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"))
     }
    

    【讨论】:

    • 哦,很好,我现在明白了,至于返回元组,我可以返回它的 Future,然后 flatMapping 它会处理它,否则我会得到Future[Future..。我理解那部分。我还是不明白的是,为什么编译器现在高兴并且同意我想要的返回类型。
    • 因为在这两种情况下,返回类型是Future[(Int, Int)]Future[BadRequestException],并且这个返回类型的联合是Future[(Int, Int)]。而在您的原始地图操作中,两个返回类型是 Future[(Int, Int)]Future[Future[BadRequestException]],它们转换为联合类型 Future[Object]
    • 在哪里可以了解更多信息。非常感谢您提供如此简洁明了的解释。我想了解哪种联合类型导致哪种最终类型
    • 你也可以抛出异常而不是返回 Future.failed 然后你可以避免平面映射你的未来..def test() = Future{10} map { case x if x%2 == 0 => (x,x) case _ => throw new BadRequestException("dd") }
    猜你喜欢
    • 2018-06-15
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 2013-08-17
    • 2013-01-10
    • 1970-01-01
    • 2016-05-09
    • 2011-05-24
    相关资源
    最近更新 更多