【问题标题】:Catch all exceptions in playframework and friendly error page in production捕获 playframework 中的所有异常和生产中的友好错误页面
【发布时间】:2023-04-01 12:36:01
【问题描述】:

在我的 play 应用程序中,我像您通常在代码中所做的一样记录日志(跟踪、调试、错误等)。

对于那些我没有捕捉到的错误,我可以将我的日志记录放在哪里,以便它缓存我错过的错误?是否有一个我可以挂钩的中心事件来捕获所有错误?

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

【问题讨论】:

标签: scala playframework


【解决方案1】:

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)
      ))
  }

}

【讨论】:

  • play 如何知道它是否处于 prod 中?
  • play run 是开发模式。生产模式可以通过play start 或此处列出的方法启动:playframework.com/documentation/2.3.x/Production
  • 现在好了,views.html.errorPage(ex) 是什么?我如何创建它?
  • 好的,让我尝试另一种方式。 “views.html.errorPage(ex)”是什么意思?那是一个包含 java 类的文件夹,其中包含一个接受异常的方法 errorPage() 吗?还是一个名为errorPage.html 的HTML 页面?还是什么?
  • @UpAllNight 它只是一个Result,您可以像普通操作一样返回 Json 对象
【解决方案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 对象必须在默认包中才能工作。只要Action 中存在未处理的异常,就会调用onError。在那里,您可以访问原始的Request,以及引发的异常。在这里,我只是记录异常消息并返回带有一些错误视图的Result。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-15
    • 2011-06-03
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 2015-07-05
    相关资源
    最近更新 更多