无法在未来恢复 - scala
unable to recover in Future - scala
我希望下面的代码会生成值 5,因为我已经编写了 recover 来处理异常和 return 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
它不起作用,因为 恢复 的未来不是您正在调用 Await.result()
的未来。
从 Future's scaladoc,我们了解到 recover
创建了一个新的 future,它将处理这个 future 可能包含的任何匹配的 throwable。如果没有匹配项,或者如果这个未来包含有效结果,那么新的未来将包含相同的结果。
因此,您现在感兴趣的就是这个新未来。
试试这个:
val result = futures1.map(x=>x+3)
.recover {
case e:Exception => 5
}
Await.result(result,100 millis)
我希望下面的代码会生成值 5,因为我已经编写了 recover 来处理异常和 return 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
它不起作用,因为 恢复 的未来不是您正在调用 Await.result()
的未来。
从 Future's scaladoc,我们了解到 recover
创建了一个新的 future,它将处理这个 future 可能包含的任何匹配的 throwable。如果没有匹配项,或者如果这个未来包含有效结果,那么新的未来将包含相同的结果。
因此,您现在感兴趣的就是这个新未来。
试试这个:
val result = futures1.map(x=>x+3)
.recover {
case e:Exception => 5
}
Await.result(result,100 millis)