【发布时间】:2013-03-18 07:32:46
【问题描述】:
我正在使用 Play!Framework 1.2.5。我想以定制的方式处理游戏框架中的所有错误。例如,如果出现路由错误,我想显示适当的错误消息,而不是显示整个路由文件。同样对于其他错误,我想显示我自己的错误页面。如何做到这一点?
【问题讨论】:
标签: java playframework playframework-1.x
我正在使用 Play!Framework 1.2.5。我想以定制的方式处理游戏框架中的所有错误。例如,如果出现路由错误,我想显示适当的错误消息,而不是显示整个路由文件。同样对于其他错误,我想显示我自己的错误页面。如何做到这一点?
【问题讨论】:
标签: java playframework playframework-1.x
我们需要比@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);
}
这样我们可以发现应用程序中丢失的路线/错误的链接。
【讨论】:
@Catch 拦截器放置在控制器中由拦截器@Before 标记的某个操作处时,可能会出现问题。因为他们两个充当拦截器。但是,问题不大,只是不要用@Catch 标记动作,只需在方法内部处理.. 不是吗?
@Before 带注释的方法中并不重要。我认为您可以通过在 @Before 方法中抛出自己的 CustomException 并尝试捕获它来轻松尝试。
您可以通过在views 包上创建名为errors 的新子包来定义自己的错误页面。在这个子包中,您可以使用错误代码名称为您的自定义错误页面创建模板文件,例如:
404.html 未找到错误页面403.html 禁止错误页面500.html 内部服务器错误页面不用担心默认路由未找到错误页面,它仅在开发模式下显示以帮助开发阶段。在生产模式下,不会显示此错误页面(默认框架错误页面)。
-- 更新
这个@Catch 注释可能对处理其他类型的异常有用。它充当控制器中动作的拦截器,如果在执行某些操作时发生异常,它将处理异常。请注意,此注解仅适用于 Controller 类。
请查看文档here 以进一步阅读。
【讨论】: