完全覆盖 PlayFramework 中的错误处理程序

Complete override of error handler in PlayFramework

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

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

恐怕您可以更改它的使用方式,但 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 在评论中提到的那样,我们可以使用 动作组合 来控制动作行为而不被打扰。我们需要声明一个函数来获取将转换为结果的 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 link or this link 了解更多信息。