1

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

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

谢谢,普拉萨德

4

1 回答 1

3

这取决于您捕获它们的方式/位置。通常,您希望像这样指定一个<error-page>in web.xml

<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/error.html</location>
</error-page>

这基本上显示了error.html任何e instanceof java.lang.Exception.

另一种方法是在of的Filter监听中捕捉到它:url-pattern/*

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)端执行业务逻辑被认为是不好的做法的原因之一。

于 2010-06-08T16:40:59.917 回答