未来无法恢复 - 斯卡拉

时间:2016-12-30 10:12:13

标签: scala future

我希望以下代码生成值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

1 个答案:

答案 0 :(得分:3)

它不起作用,因为恢复的未来不是你正在呼叫Await.result()的那个。

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

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

试试这个:

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

Await.result(result,100 millis)