完全覆盖 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
}
当 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
}