【问题标题】:Play Framework client server exception handlingPlay Framework客户端服务器异常处理
【发布时间】:2016-10-04 10:17:57
【问题描述】:

我是新手玩框架。我正在使用 Play Framework (2.4)scala。我需要您对异常处理的意见。

我们的播放客户端控制器正在调用播放服务器控制器。现在我们需要引入自定义异常,这些异常将从服务器抛出,客户端将捕获该异常并执行必要的操作。

现在,当我从服务器抛出任何异常时,它并没有按原样到达客户端。我发现这背后的原因是,Play 捕获所有异常并将它们转换为500 Internal Server Error

那么是否可以在不修改的情况下向客户端发送自定义异常?

【问题讨论】:

  • 客户端控制器通过反向路由直接调用服务器控制器方法?喜欢controllers.routes.ServerController.someServerMethod()
  • 不确定什么是反向路由,但我们不会以这种方式调用服务器。我们正在调用服务器 URL 并在 URL 中传递参数。

标签: scala playframework


【解决方案1】:

通过自己在播放控制器中处理异常来停止播放500

您可以为此编写自定义操作构建器

object ExceptionCatchingAction extends ActionBuilder[Request] {
    override def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]): Future[Result] = {
      block(request).recover { case th =>
        //use meaningful http codes instead of OK here based on the exception type
        Ok(Json.obj("msg" -> "error occurred", "info" -> "error info"))
      }
    }
  }

这样使用

object ExampleController extends Controller {
    def doStuff = ExceptionCatchingAction { req =>
      throw new Exception("foo")
    }
  }

你的客户不会得到所有的例外。这样客户现在就可以决定要做什么了。

【讨论】:

  • 用错误回复Ok是一个坏习惯,你应该使用更有意义的http错误代码。
  • @vdebergue ...你说得对。将信息添加到答案中
  • 我在 "Ok(Json.obj("msg" -> "error occurred", "info" -> "error info"))" 行收到编译错误,说'Expression of type Result不符合预期的类型 _U'
  • @YogeshPatil ... 答案中的代码编译并经过测试
  • 您使用的 Play 框架版本是什么?我正在使用 v2.4
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
相关资源
最近更新 更多