Scala 除了map和flatMap之外,如何使用futures将异常转换为另一个异常

Scala 除了map和flatMap之外,如何使用futures将异常转换为另一个异常,scala,scala-2.9,Scala,Scala 2.9,我们目前有这样的代码 def somemethod() : Future[Resp] = { val responseFuture = service.serveV2(req) val nextFuture = responseFuture flatMap { //do something on success including call to next async service } nextFuture } 当然,映射在超时时被跳过,但我需要将该超时

我们目前有这样的代码

def somemethod() : Future[Resp] = {
   val responseFuture = service.serveV2(req)
   val nextFuture = responseFuture flatMap {
       //do something on success including call to next async service
   }
   nextFuture
}
当然,映射在超时时被跳过,但我需要将该超时转换为一个适当的异常,我可以将该异常传递到web框架以返回正确的响应代码。在scala中如何做到这一点


同样值得注意的是,我需要回报未来。也许我应该创造一个承诺,并在未来做出回应。在这个承诺失败时,还是我在这里完全偏离了底线?(我想知道是否有更简单的方法,或者我可以尝试沿着这条路走下去)。

您可能想看看
recoverWith
,因为它允许您将一个
可丢弃的
转换为另一个
未来的
,这可能是失败的,也可能是成功的,这取决于您想如何处理它。这比常规的
恢复
更灵活,因为您不必总是在转换中返回成功的结果。所以你可以这样做:

val newFuture = fut.flatMap(doSomething).recoverWith{
  case t:TimeoutException => Future.failed(new SomeOtherException("timeout!!!"))
}

如果我们获得成功的未来,
flatMap
将生效,
recoverWith
将不会起任何作用,因为它的部分功能将不匹配。如果future因非TimeoutException而失败,而
flatMap
不会发生,并且
recoverWith
也不会做任何事情,因为PF将不匹配。如果由于TimeoutException而失败,则不会发生
flatMap
,而
recoverWith
将启动,并将其转化为失败的未来,包装一个新的
SomeOtherException

您可能需要看看
recoverWith
,因为它允许您将一个
可丢弃的
转化为另一个
未来
可能是失败,也可能是成功,这取决于您希望如何处理它。这比常规的
恢复
更灵活,因为您不必总是在转换中返回成功的结果。所以你可以这样做:

val newFuture = fut.flatMap(doSomething).recoverWith{
  case t:TimeoutException => Future.failed(new SomeOtherException("timeout!!!"))
}

如果我们获得成功的未来,
flatMap
将生效,
recoverWith
将不会起任何作用,因为它的部分功能将不匹配。如果future因非TimeoutException而失败,而
flatMap
不会发生,并且
recoverWith
也不会做任何事情,因为PF将不匹配。如果它由于TimeoutException而失败,那么
flatMap
将不会发生,
recoverWith
将启动,并将其转化为失败的未来,包装一个新的
SomeOtherException

嗯,这似乎对我来说不是编译,因为我在future[Response]上没有得到recoverWith方法,而这正是flatMap返回的。我不太明白你的意思。把它擦掉!!!这个项目使用的是它自己的未来,没有一个recoverWith方法:(ugh.uhm,这似乎没有为我编译,因为我在Future[Response]上没有得到recoverWith方法,而Future[Response]正是flatMap返回的。我在这里不太明白你的意思。划破它!!!这个项目使用的是它自己的未来,没有一个recoverWith方法:(ugh)。