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)))}