Как выполнить код после исключения в Scala, используя Try - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть два актера, которые могут либо вернуть 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

Здесь я хочу достичь
script-1 , если futureA и FutureB успешно, я должен получить что-то вроде (futureResponseA, futureResponseB) // (true, true)

script-2 , если futureA завершится неудачей, он должен продолжитьсяс 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 Ответ

0 голосов
/ 20 февраля 2019

A 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 сценария, которые вы изложили: (Успех, Успех) (Успех, Отказ) (Отказ, Успех) (Отказ, Отказ)

...