我有一个抛出异常的
Try
,我想将其转换为Future
,以便我可以使用recoverWith
。如何在不处理Try
中的任何异常的情况下将其转换为Future
(只需在Future
中进行恢复)?请注意,需要使用Await来测试您的future。以下是示例代码,但它也会在到达时抛出异常(我得到的是new RuntimeException("-------failed-------")
):val t = Try(throw new RuntimeException("my"))
val resF : Future[String] = if (t.isSuccess)
Future.successful(t.get)
else
Future.failed(new RuntimeException("-------failed-------"))
val resFWithRecover = resF.recoverWith{
case NonFatal(e) =>
Future.successful("recoveredWith")
}
Await.result(resFWithRecover, Duration("5s"))
resF
上使用Await
。相反,等待recoverWith
返回的内容。换句话说,val resRW = resF.recoverWith{...}
,然后Await.result(resRW, ...
。 - jwvhfromTry()
。我的测试表明m-z的代码是有效的。你只需要在适当的Future
上等待,即不是从fromTry()
返回的那个,而是从fromTry()
之后返回的recoverWith()
函数**。 - jwvhAwait
来阻塞,那么使用Future
有什么用呢?这没有意义。其次,如果你要使用Await
,你需要在最后一个Future
上这样做,也就是调用recoverWith
的结果。在我的例子中,你会在res5
上等待,而不是resF
。即Await.result(resF.recoverWith { ... }, Duration.Inf)
。 Futures是不可变的。恢复resF
不会改变resF
,它会创建一个新的Future
。 - Michael Zajac