Карта Исключение неудачного будущего
Какой самый чистый способ map
Exception
неудавшегося Future
в scala?
Скажем, у меня есть:
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
val f = Future {
if(math.random < 0.5) 1 else throw new Exception("Oh no")
}
Если Future будет успешным с 1
, я хотел бы сохранить это, но если он не сработает, я хотел бы изменить Exception
на другой Exception
.
Лучшее, что я мог придумать, - это преобразование, но это требует от меня ненужной функции для успеха:
val f2 = f.transform(s => s, cause => new Exception("Something went wrong", cause))
Есть ли какая-либо причина, что нет mapFailure(PartialFunction[Throwable,Throwable])
?
Ответы
Ответ 1
Существует также:
f recover { case cause => throw new Exception("Something went wrong", cause) }
Так как Scala 2.12 вы можете сделать:
f transform {
case s @ Success(_) => s
case Failure(cause) => Failure(new Exception("Something went wrong", cause))
}
или
f transform { _.transform(Success(_), cause => Failure(new Exception("Something went wrong", cause)))}
Ответ 2
Вы можете попробовать recoverWith
, как в:
f recoverWith{
case ex:Exception => Future.failed(new Exception("foo", ex))
}