scala akka future scala-2.10

scala - Mapear la excepción de un futuro fallido



akka future (2)

¿Cuál es la forma más limpia de map la Exception de un Future fallido en Scala?

Di que tengo:

import scala.concurrent._ import scala.concurrent.ExecutionContext.Implicits.global val f = Future { if(math.random < 0.5) 1 else throw new Exception("Oh no") }

Si el futuro tiene éxito con 1 , me gustaría mantenerlo, sin embargo, si falla, me gustaría cambiar la Exception a una Exception diferente.

Lo mejor que se me ocurre es la transformación, sin embargo, eso me obliga a realizar una función innecesaria para el caso de éxito:

val f2 = f.transform(s => s, cause => new Exception("Something went wrong", cause))

¿Hay alguna razón por la que no haya mapFailure(PartialFunction[Throwable,Throwable]) ?


Podrías intentar recoverWith como en:

f recoverWith{ case ex:Exception => Future.failed(new Exception("foo", ex)) }


También hay:

f recover { case cause => throw new Exception("Something went wrong", cause) }

Desde Scala 2.12 puedes hacer:

f transform { case s @ Success(_) => s case Failure(cause) => Failure(new Exception("Something went wrong", cause)) }

o

f transform { _.transform(Success(_), cause => Failure(new Exception("Something went wrong", cause)))}