如何使用 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
不是 Awaitable
,Future
不会抛出异常,但 Await
可以。所以你需要用 Try
包装 Await
并且,因为你想捕获一个或两个失败,这意味着 2 个不同的 Await
s.
val resultTuple = (Try(Await.result(futureA, Duration.Inf))
,Try(Await.result(futureB, Duration.Inf)))
结果类型为Tuple2[Try[Boolean],Try[Boolean]]
,涵盖了您列出的4种情况:(成功,成功)(成功,失败)(失败,成功)(失败,失败)
我有两个演员,他们可以 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
不是 Awaitable
,Future
不会抛出异常,但 Await
可以。所以你需要用 Try
包装 Await
并且,因为你想捕获一个或两个失败,这意味着 2 个不同的 Await
s.
val resultTuple = (Try(Await.result(futureA, Duration.Inf))
,Try(Await.result(futureB, Duration.Inf)))
结果类型为Tuple2[Try[Boolean],Try[Boolean]]
,涵盖了您列出的4种情况:(成功,成功)(成功,失败)(失败,成功)(失败,失败)