在JSF中处理未捕获的异常

时间:2010-06-08 16:03:14

标签: jsf uncaught-exception

我正在开发异常处理框架。异常处理框架适用于JSF应用程序。

我面临的问题是跟踪未捕获的异常并显示通用消息。我能够处理被执行的操作的未捕获异常(比如单击按钮),但是在加载JSF页面或初始化时,我无法在框架级别捕获未捕获的运行时异常。任何帮助将非常感激。

谢谢, 普拉萨德

1 个答案:

答案 0 :(得分:3)

这取决于你捕捉它们的方式/位置。通常情况下,您希望在<error-page>中为web.xml指定<error-page> <exception-type>java.lang.Exception</exception-type> <location>/error.html</location> </error-page> ,如下所示:

error.html

这基本上显示了e instanceof java.lang.Exception的{​​{1}}页面。

另一种方法是在Filter url-pattern /*的{​​{1}}中收听它:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    try {
        chain.doFilter(request, response);
    } catch (Exception e) {
        request.setAttribute("exception", e);
        request.getRequestDispatcher("/error.html").forward(request, response);
    }
}

这基本上是一样的,你只需要更多的自由来控制响应和做其他事情,比如记录。

无论哪种方式,只要响应已经提交(即标题已经发送到客户端),它就会失败。然后,您应该在服务器日志中注意到IllegalStateException: response already committed,并且客户端将面对半烘焙(甚至是空白)页面。这是一个不归路。您希望在呈现响应之前执行任何业务逻辑。这也是在视图(JSP / Facelets)中执行业务逻辑被视为不良做法的原因之一。