处理JSF应用程序中的异常

时间:2010-10-22 20:43:16

标签: java jsf

这可能是一个问题太模糊,但我正在寻找一些有关处理JavaServer Faces应用程序中的异常的帮助或最佳实践。

现在,每当我捕获异常时,我都会记录它,然后抛出我创建的另一个异常,比如MyCustomException。此自定义异常采用捕获的Throwable对象并将堆栈跟踪通过电子邮件发送给我,以便我知道发生了异常。就目前而言,只要在发生异常时收到通知,这似乎对我有用。

然而,我遇到的麻烦是如何向用户提供一个漂亮的错误页面,让他们知道出现了问题并且我已经收到错误通知。做一些搜索,我发现了一些文章,展示了如何使用类似于以下内容的方式将用户重定向到另一个页面:

FacesContext context = FacesContext.getCurrentInstance();
ExternalContext extContext = context.getExternalContext();

String url = extContext.encodeActionURL(extContext.getRequestContextPath() +
    "/messages.faces");

extContext.redirect(url);

但这对于每个捕获的异常基本上复制和粘贴似乎有点过分,这并不完全遵循DRY原则。最后,我想我想要做的是在发生异常时向我发送一封电子邮件,然后能够将消息发送到一般错误页面,然后向用户显示该消息。

我应该遵循的任何想法或最佳做法?提前感谢您提供任何建议!我很难过。

注意:如果有帮助,我正在使用JSF 2.0和Facelets。

2 个答案:

答案 0 :(得分:4)

此网址可能对您有用:

http://weblogs.java.net/blog/edburns/archive/2009/09/03/dealing-gracefully-viewexpiredexception-jsf2

http://andyschwartz.wordpress.com/2009/07/31/whats-new-in-jsf-2/

http://download.oracle.com/docs/cd/E17802_01/j2ee/javaee/javaserverfaces/2.0/docs/api/javax/faces/context/ExceptionHandler.html

基本上你必须在JSF2.0,ExceptionHandler中使用新功能。这是处理意外异常的中心点。 您可以指出每个例外类型使用哪个页面。

答案 1 :(得分:1)

您需要使用类似servlet过滤器的东西来捕获(和处理)异常。这样,只有一个全局捕获块: - )

也就是说,您可以在FacesServlet周围映射一个过滤器:

try {
    chain.proceed(request, response);
} catch (Exception e) {
    // handle the exception
}

您的JSF实现也可能具有错误页面的概念。如果是,则可能必须禁用错误页面,以便异常到达过滤器。

您可能会发现http://javaboutique.internet.com/tutorials/Servlet_Filters/有帮助。