在scala中将Try转换为Future,并将recoverWith转换为Future

ozm*_*zma 9 concurrency scala

[编辑]

被问到时我是新手.这就是答案:

Future.fromTry(Try( 1/0 ))
Run Code Online (Sandbox Code Playgroud)

其他值得了解的事情(可能会错过 - 在检查时引导我):

Future.successful( 1/0 )
Run Code Online (Sandbox Code Playgroud)

会抛出一次.Future.successful和Future.failure不仅是创建Future的便捷方式,它们还跳过执行上下文循环并按顺序进行求值.


[原始问题]

我有一个Try抛出异常.我想要Try成为一个Future我能够做到的recoverWith.

如果你不知道,请不要猜.

问题是,如何TryFuture不处理任何异常的情况下转换为Try(仅在未来的恢复中)?

请注意,需要Await来测试您未来的结果

代码示例演示了我的想法,但是一旦达到它就会抛出(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"))
Run Code Online (Sandbox Code Playgroud)

Mic*_*jac 19

...如何TryFuture不处理任何异常的情况下转换为Try

使用Future.fromTry.

scala> val t = Try(throw new RuntimeException("my"))
t: scala.util.Try[Nothing] = Failure(java.lang.RuntimeException: my)

scala> val resF = Future.fromTry(t)
resF: scala.concurrent.Future[Nothing] = scala.concurrent.impl.Promise$KeptPromise@57cf54e1

scala> resF.recoverWith{
     |   case NonFatal(e) =>
     |     Future.successful("recoveredWith")
     | }
res5: scala.concurrent.Future[String] = scala.concurrent.impl.Promise$DefaultPromise@1b75c2e3
Run Code Online (Sandbox Code Playgroud)