【问题标题】:Complete override of error handler in PlayFramework完全覆盖 PlayFramework 中的错误处理程序
【发布时间】:2015-05-26 11:33:03
【问题描述】:

当 Play 应用程序产生意外异常时,您可以覆盖 Global.onError() 中的响应。但是,Play 似乎仍将异常写入为错误日志。有没有办法覆盖该行为(仅针对特定例外)?

案例说明:通常对来自 API 调用的意外异常的响应将是一个错误页面,在这种情况下,也可以将其记录为错误。但是,一些非常具体的 API 异常可能只会导致重定向到注销页面,例如,如果会话已过期,或者用户被管理员强制注销。在这些情况下,我不希望 API 异常被记录为错误。充其量只是一个警告。我当然可以在我进行 API 调用的每个地方处理这种情况,但这是一个令人生畏的观点。全局错误处理程序似乎是一个更好的地方。

【问题讨论】:

    标签: playframework


    【解决方案1】:

    恐怕你可以改变它的使用方式,但 Play 总是会将它记录为错误before it gives control over the error。但是您仍然可以根据抛出的异常更改响应。

    override def onError(request: RequestHeader, ex: Throwable) = {
      Future.successful(InternalServerError(
        views.html.errorPage(ex)
      ))
    }
    

    如果您想了解更多有关如何更改此行为或其他行为的信息,可以查看here

    编辑

    正如 @cristian-vrabie 在 cmets 中提到的那样,我们可以使用 动作组合 来控制动作行为而不会造成干扰。我们需要声明一个函数,该函数会获取一个将转换为结果的 Action。

    import play.api.mvc._
    
    case class Logging[A](action: Action[A]) extends Action[A] {
      def apply(request: Request[A]): Future[SimpleResult] = {
        Logger.info("Calling action")
        action(request)
      }
    
      lazy val parser = action.parser
    }
    

    您可以查看this linkthis link 了解更多信息。

    【讨论】:

    • 啊,链接的线程确实提到了这个should be done through Action composition。由于我已经为登录检查执行此操作,因此移动重定向以将块调用包装为相关异常的恢复是微不足道的。这将完全删除异常,因此不会触发日志。
    • 你能编辑你的答案来暗示这个吗?它可能对其他人更有用,我会接受它作为解决方案。
    • 当然。很高兴知道它很有帮助。我将更新我的答案以使其更有用。
    • 如果您需要的答案不够清楚(或者我错过了重点),请随时编辑我的答案
    猜你喜欢
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2013-03-06
    相关资源
    最近更新 更多