Подтвердить что ты не робот

Карта Исключение неудачного будущего

Какой самый чистый способ 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])?

4b9b3361

Ответ 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))
}