Quel est le moyen le plus propre de map
le Exception
d'un Future
échoué dans scala?
Dis que j'ai:
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 le futur réussit avec 1
, Je voudrais garder cela, mais s'il échoue, je voudrais changer le Exception
en un autre Exception
.
Le mieux que j'ai pu trouver est de transformer, mais cela nécessite que je fasse une fonction inutile pour le cas de réussite:
val f2 = f.transform(s => s, cause => new Exception("Something went wrong", cause))
Y a-t-il une raison pour laquelle il n'y a pas de mapFailure(PartialFunction[Throwable,Throwable])
?
Il y a aussi:
f recover { case cause => throw new Exception("Something went wrong", cause) }
Depuis Scala 2.12 vous pouvez faire:
f transform {
case s @ Success(_) => s
case Failure(cause) => Failure(new Exception("Something went wrong", cause))
}
ou
f transform { _.transform(Success(_), cause => Failure(new Exception("Something went wrong", cause)))}
Vous pouvez essayer recoverWith
comme dans:
f recoverWith{
case ex:Exception => Future.failed(new Exception("foo", ex))
}