【发布时间】:2015-07-02 14:14:05
【问题描述】:
我试图弄清楚如何在 Play Framework 2.4 中的异步操作调用的函数中从未来捕获异常。但是,我使用恢复的代码似乎永远不会被执行——我总是得到一个执行异常页面而不是一个 Ok 响应。
动作代码为:
def index = Action.async {
cardRepo.getAll()
.map {
cards => Ok(views.html.cardlist(cards))
}.recover{
case e: Exception => Ok(e.getMessage)
}
}
cardRepo.getAll 中的代码(我已经硬编码了一个 throw new Exception 进行实验)是:
def getAll(): Future[Seq[Card]] = {
implicit val cardFormat = Json.format[Card]
val cards = collection.find(Json.obj())
.cursor[Card]()
.collect[Seq]()
throw new Exception("OH DEAR")
cards
}
我在 Stack Overflow 上看到过类似的问题,但我看不出我做错了什么。
【问题讨论】:
-
您的异常示例不正确。异常不是从
Future内抛出,而是从方法getAll内抛出,所以future上的map函数永远不会被调用。将getAll的正文替换为:Future.failed(new RuntimeException)。 -
顺便说一句,不要在函数中定义隐式。这是一种资源的浪费。 :-) 将其移至
Card伴随对象。
标签: scala playframework