处理所有异常并显示自定义错误页面而不是默认框架错误页面
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(自定义异常页面)(转)