Scalaで失敗したmap
のException
Future
への最もクリーンな方法は何ですか?
私が持っていると言う:
_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])
がない理由はありますか?
もあります:
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)))}
次のようにrecoverWith
を試すことができます。
f recoverWith{
case ex:Exception => Future.failed(new Exception("foo", ex))
}