【问题标题】:unable to recover in Future - scala无法在未来恢复 - scala
【发布时间】:2016-12-30 22:18:30
【问题描述】:

我希望下面的代码会生成值 5,因为我已经编写了恢复来处理异常并返回 5。但我总是在 IntelliJ 中看到异常。这里有什么错误?

import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Failure, Success, Try}
import scala.concurrent.duration._
import scala.language.postfixOps

object ConcurrencyExample extends App {

val time = System.currentTimeMillis()

val futures1: Future[Int] = Future {
    println("in Future.. sleeping")
    Thread.sleep(10)
    println("awakein future")
    throw new Exception("future failed")
    1
}

val result = futures1.map(x=>x+3)
result recover {
  case e:Exception => 5
}

result onComplete{
  case Success(v)=>println("result is "+v)
  case Failure(e) =>println("failed result:"+e)
}

Await.result(result,100 millis)

}

结果

in Future.. sleeping
awakein future
Exception in thread "main" LegacyException: future failed

【问题讨论】:

    标签: scala future


    【解决方案1】:

    它不起作用,因为可以恢复的未来不是你打电话给Await.result()的那个。

    Future's scaladoc,我们了解到recover 创建了一个新的未来,它将处理这个未来可能包含的任何匹配的投掷物。如果没有匹配,或者如果这个未来包含一个有效的结果,那么新的未来将包含相同的结果。

    因此,您现在感兴趣的是这个新的未来。

    试试这个:

    val result = futures1.map(x=>x+3)
                 .recover {
                     case e:Exception => 5
                 }
    
    Await.result(result,100 millis)
    

    【讨论】:

    • 谢谢。一个疑问 - 正在调用future1 的地图。我的理解是只有未来成功时才会调用map。如果 future 不成功, .recover 会在 futures1 上调用吗?我对语法不熟悉。您正在调用 futures1.map 但不是 futures1.recover。这是某种 OrElse 吗?
    • .map 将返回一个新的未来,它要么失败,要么在futures1 成功时应用传递的操作。 Scala 的对象通常是不可变的,任何看起来像是在修改某些东西的方法实际上都是在为您返回一个带有您想要的修改的新实例。因此,在这里,当futures1 失败时恢复将起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    相关资源
    最近更新 更多