如何使用try在scala异常后执行代码

zphenhs4  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(462)

我有两个参与者,他们要么返回一个布尔值,要么抛出一个异常

val futureA: Future[Boolean] = ask(ActorA, MessageA(obj)).mapTo[Boolean]
val resultA = Await.result(futureA, timeout.duration) //can return boolean or throw an exception 

val futureB: Future[Boolean] = ask(ActorB, MessageB(obj)).mapTo[Boolean]
       val resultb = Await.result(futureB, timeout.duration)//can return boolean or throw an exception

在这里我想实现
场景1如果futurea和futureb成功,我应该得到(futuresponsea,futuresponseb)//(true,true)
场景2如果futurea失败,它应该继续futureb如果它成功返回,我应该得到类似的结果(除了offuturea,resultoffutureb)
场景3如果futurea成功返回而futureb失败,我应该得到类似的结果(futuresponsea,exceptionoffutureb)
场景4如果futurea和futureb都失败了,我应该得到类似的结果(exceptionoffuturea,exceptionoffutureb)
为此,我尝试了val futurea=ask(actora,messagea(obj)).mapto[boolean]val futureb=ask(actorb,messageb(obj)).mapto[boolean]

val f = Try {Future.sequence(List(futureA, futureB))}
  val result = Await.result(f, Duration.Inf)

但我在这个问题上犯了错误 val result 线路

found   : scala.util.Try[scala.concurrent.Future[List[Boolean]]]
[error]  required: scala.concurrent.Awaitable[?]

我如何存档这些扫描请指点

brccelvz

brccelvz1#

Try 不是一个 Awaitable ,和 Future 不会抛出异常,但是 Await 可以。所以你得把衣服包起来 Await 用一个 Try 而且,由于您希望捕获其中一个或两个失败,这意味着两个不同的 Await s。

val resultTuple = (Try(Await.result(futureA, Duration.Inf))
                  ,Try(Await.result(futureB, Duration.Inf)))

结果类型为 Tuple2[Try[Boolean],Try[Boolean]] ,它涵盖了您列出的4个场景:(成功,成功)(成功,失败)(失败,成功)(失败,失败)

相关问题