Как выполнить код после исключения в Scala, используя Try
У меня есть два актера, которые могут либо вернуть Result, который является логическим значением в моем случае, либо они могут выдать исключение, вот мой код
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)
Сценарий 2, если в будущем A происходит сбой, он должен продолжить FutureB, если он вернется успешно, я должен получить что-то вроде (exceptionOfFutureA, resultofFutureB)
сценарий 3, если futureA вернется успешно, а 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[?]
Как я могу архивировать эти сканеры, пожалуйста, руководство
1 ответ
Try
не является Awaitable
и Future
не будет выбрасывать исключение, но Await
Можно. Так что вам нужно обернуть Await
с Try
и, поскольку вы хотите захватить один или оба сбоя, это означает, что 2 различных Await
s.
val resultTuple = (Try(Await.result(futureA, Duration.Inf))
,Try(Await.result(futureB, Duration.Inf)))
Тип результата Tuple2[Try[Boolean],Try[Boolean]]
, который охватывает 4 сценария, которые вы изложили: (Успех, Успех) (Успех, Отказ) (Отказ, Успех) (Отказ, Отказ)