如何使用 Try 在 scala 中的异常后执行代码

how to execute code after the exception in scala using Try

我有两个演员,他们可以 return 结果在我的例子中是一个布尔值,或者他们可以抛出异常这里是我的代码

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 成功,我应该得到类似 (futureResponseA,futureResponseB) //(true, true)

scenario-2 如果 futureA 失败,它应该继续 FutureB 如果它 return 成功,我应该得到类似 (exceptionOfFutureA,resultofFutureB)

场景 3 如果 futureA return 成功而 futureB 失败,我应该得到类似 (futureResponseA,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[?]

如何存档这些扫描仪,请指导

A Try 不是 AwaitableFuture 不会抛出异常,但 Await 可以。所以你需要用 Try 包装 Await 并且,因为你想捕获一个或两个失败,这意味着 2 个不同的 Awaits.

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

结果类型为Tuple2[Try[Boolean],Try[Boolean]],涵盖了您列出的4种情况:(成功,成功)(成功,失败)(失败,成功)(失败,失败)