处理失败的未来

时间:2014-06-30 21:37:39

标签: playframework future playframework-2.3

在Play Framework 2.3中,操作可以通过以下成功的未来调用生成结果:

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

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

例如,一个动作如何产生一个InternalServerError结果,并在未来的失败中返回该消息?

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

1 个答案:

答案 0 :(得分:5)

对于单个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) }
}
在这种情况下,

recoverPartialFunction[Throwable, Result],因此您可以更好地处理错误处理,PartialFunction中未定义的任何内容都将保持失败{{} 1}}。更一般地说,您可以使用实现此目的的自定义Future