【问题标题】:Handle all exceptions and display custom error page instead of default framework error page处理所有异常并显示自定义错误页面而不是默认框架错误页面
【发布时间】:2013-03-18 07:32:46
【问题描述】:

我正在使用 Play!Framework 1.2.5。我想以定制的方式处理游戏框架中的所有错误。例如,如果出现路由错误,我想显示适当的错误消息,而不是显示整个路由文件。同样对于其他错误,我想显示我自己的错误页面。如何做到这一点?

【问题讨论】:

    标签: java playframework playframework-1.x


    【解决方案1】:

    我们需要比@iwawiwi 提到的更多的控制来确定数据库抛出了什么数据库约束消息。这是通过在Controller 类中使用带有@Catch 注释的方法来解决的:

    @Catch(value=PersistenceException.class)
    public static void handleException(PersistenceException exception) {
        ..
    }
    

    我以前没有听说过这个注释,这在我的情况下效果很好。

    对于缺少的路线,我们也在Controller 中添加了一些内容:

    @Catch(value=ActionNotFoundException.class)
    public static void catchRouteNotFound(ActionNotFoundException exception) {
        String referer = session.get("referer");
    
        Logger.error("ActionNotFoundException, referer: %s", referer);
        Logger.error("Exception: %s", exception);
    }
    

    这样我们可以发现应用程序中丢失的路线/错误的链接。

    【讨论】:

    • +1 哇,太酷了。我只知道注释功能,.. ;) 但是,当我们想将@Catch 拦截器放置在控制器中由拦截器@Before 标记的某个操作处时,可能会出现问题。因为他们两个充当拦截器。但是,问题不大,只是不要用@Catch 标记动作,只需在方法内部处理.. 不是吗?
    • 我认为诚实并不重要。据我所知,Play 在您的控制器中四处寻找抛出异常的异常处理程序。我认为是否将其放入 @Before 带注释的方法中并不重要。我认为您可以通过在 @Before 方法中抛出自己的 CustomException 并尝试捕获它来轻松尝试。
    【解决方案2】:

    您可以通过在views 包上创建名为errors 的新子包来定义自己的错误页面。在这个子包中,您可以使用错误代码名称为您的自定义错误页面创建模板文件,例如:

    1. 404.html 未找到错误页面
    2. 403.html 禁止错误页面
    3. 500.html 内部服务器错误页面
    4. 等等……

    不用担心默认路由未找到错误页面,它仅在开发模式下显示以帮助开发阶段。在生产模式下,不会显示此错误页面(默认框架错误页面)。

    -- 更新

    这个@Catch 注释可能对处理其他类型的异常有用。它充当控制器中动作的拦截器,如果在执行某些操作时发生异常,它将处理异常。请注意,此注解仅适用于 Controller 类。

    请查看文档here 以进一步阅读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2015-03-20
      • 1970-01-01
      • 2011-01-01
      • 2020-01-21
      • 1970-01-01
      相关资源
      最近更新 更多