web-dev-qa-db-ja.com

失敗した未来の例外をマップする

Scalaで失敗したmapExceptionFutureへの最もクリーンな方法は何ですか?

私が持っていると言う:

_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])がない理由はありますか?

31
theon

もあります:

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

次のようにrecoverWithを試すことができます。

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