web-dev-qa-db-fra.com

Cartographiez l'exception d'un avenir raté

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])?

33
theon

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)))}
34
Viktor Klang

Vous pouvez essayer recoverWith comme dans:

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