我正在开发异常处理框架。异常处理框架适用于JSF应用程序。
我面临的问题是跟踪未捕获的异常并显示通用消息。我能够处理被执行的操作的未捕获异常(比如单击按钮),但是在加载JSF页面或初始化时,我无法在框架级别捕获未捕获的运行时异常。任何帮助将非常感激。
谢谢, 普拉萨德
答案 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)中执行业务逻辑被视为不良做法的原因之一。