在生产中捕获播放框架和友好错误页面中的所有异常

时间:2014-11-22 20:01:07

标签: scala playframework

在我的播放应用程序中,我正在您通常在代码中进行日志记录(跟踪,调试,错误等)。

对于那些我无法捕获的错误,我可以在哪里放置日志记录,以便缓存我错过的错误?是否有一个可以捕捉所有错误的中心事件?

另外,每当我的应用程序中出现错误时,我应该如何显示友好的错误页面? (以及如何在开发中显示错误,以及生产环境中的自定义错误页面)

2 个答案:

答案 0 :(得分:5)

https://www.playframework.com/documentation/2.3.x/ScalaGlobal#Providing-an-application-error-page

object Global extends GlobalSettings {

  override def onError(request: RequestHeader, ex: Throwable) = {
    if (! Play.isProd) super.onError(request, ex)
    else 
      Future.successful(InternalServerError(
        views.html.errorPage(ex)
      ))
  }

}

答案 1 :(得分:2)

您可以通过扩展GlobalSettings特征并覆盖onError方法来实现此目的。

import play.api.GlobalSettings
import play.api._
import play.api.mvc._
import play.api.mvc.Results._
import scala.concurrent.Future

object Global extends GlobalSettings {
    override def onError(request: RequestHeader, e: Throwable) = {
        Logger.error(e.getMessage)
        Future.successful(InternalServerError(views.html.defaultError()))
    }
}

请注意,此Global对象必须位于默认包中才能生效。只要onError中存在未处理的异常,就会调用Action。在那里,您可以访问原始Request和抛出的异常。在这里,我只是记录异常消息并返回Result并带有一些错误视图。