处理所有异常并显示自定义错误页面而不是默认框架错误页面

Posted

技术标签:

【中文标题】处理所有异常并显示自定义错误页面而不是默认框架错误页面【英文标题】: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。我想以定制的方式处理游戏框架中的所有错误。例如,如果出现路由错误,我想显示适当的错误消息,而不是显示整个路由文件。同样对于其他错误,我想显示我自己的错误页面。如何做到这一点?

【问题讨论】:

【参考方案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 的新子包来定义自己的错误页面。在这个子包中,您可以使用错误代码名称为您的自定义错误页面创建模板文件,例如:

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

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

-- 更新

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

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

【讨论】:

以上是关于处理所有异常并显示自定义错误页面而不是默认框架错误页面的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot: 11.异常处理方式1(自定义异常页面)(转)

通过自定义错误页面处理 PHP / mysql 错误(包括致命错误)

drf自定义异常处理

ThinkPHP自定义错误成功异常提示页面

Springboot异常处理

Flask:如何呈现自定义错误页面并获得 Sentry 警报?