处理失败的 Futures

5
在Play Framework 2.3中,一个操作可以通过以下方式从成功的future调用中产生结果:
def index = Action.async {
  val futureInt = scala.concurrent.Future { intensiveComputation() }
  futureInt.map(i => Ok("Got result: " + i))
}

但是,如何处理失败的未来调用,即通过调用failure()而不是success()完成的未来呢?

例如,一个操作如何使用未来的失败可抛对象生成InternalServerError结果信息呢?

onCompleteonFailure回调似乎不适合该操作的流程(它需要从成功的未来或失败的未来返回结果)。

1个回答

6

对于单个Action,您可以使用recover来将失败的Future恢复到Result

def index = Action.async {
    val futureInt = scala.concurrent.Future { intensiveComputation() }
    futureInt.map(i => Ok("Got result: " + i))
        .recover{ case e: Exception => InternalServerError(e.getMessage) }
}

在这种情况下,“recover”是一个“PartialFunction[Throwable, Result]”,因此您可以更细粒度地处理错误,而任何在“PartialFunction”中未定义的内容仍将成为失败的“Future”。更一般地说,您可能可以使用实现此功能的自定义定义的“Action”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接