【问题标题】:How to catch exception in future in play framework 2.4未来如何在游戏框架 2.4 中捕获异常
【发布时间】: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


【解决方案1】:

谢谢 Mon Calamari - 我想我现在明白了。未来来自collection.find,所以如果其中有错误,我的代码会起作用,但是因为我已经把它放在上面的函数中,所以那时没有Future。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2018-04-29
    • 1970-01-01
    • 2015-03-16
    相关资源
    最近更新 更多