【问题标题】:How to translate exception to another using futures in addition to map and flatMap除了 map 和 flatMap 之外,如何使用 futures 将异常转换为另一个
【发布时间】:2014-10-06 04:13:00
【问题描述】:

我们目前有这样的代码

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 中做到这一点?

另外值得注意的是,我需要返回那个未来。也许我应该在 responseFuture.onFailure 中创建一个承诺并将其连接到该承诺中,还是我完全不在这里? (我想知道是否有更简单的方法,或者我可以尝试走这条路)。

【问题讨论】:

    标签: scala scala-2.9


    【解决方案1】:

    您可能想看看recoverWith,因为它允许您将Throwable 变成另一个Future,这可能是失败或成功,这取决于您要如何处理它。这比常规的recover 更灵活一点,因为您不必总是在转换中返回成功的结果。所以你可以这样做:

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

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

    【讨论】:

    • 嗯,这对我来说似乎没有编译,因为我在 Future[Response] 上没有恢复方法,这是 flatMap 返回的。我不是很关注你。
    • 从头开始!!!这个项目正在使用它自己的 Future 而没有使用 recoverWtih 方法:( ugh.
    猜你喜欢
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    相关资源
    最近更新 更多