我正在开发异常处理框架。异常处理框架适用于 JSF 应用程序。
我面临的问题是跟踪未捕获的异常并显示通用消息。我能够为执行的操作处理未捕获的异常(例如单击按钮),但是在加载 JSF 页面或初始化它时,我无法在框架级别捕获未捕获的运行时异常。任何帮助将不胜感激。
谢谢,普拉萨德
我正在开发异常处理框架。异常处理框架适用于 JSF 应用程序。
我面临的问题是跟踪未捕获的异常并显示通用消息。我能够为执行的操作处理未捕获的异常(例如单击按钮),但是在加载 JSF 页面或初始化它时,我无法在框架级别捕获未捕获的运行时异常。任何帮助将不胜感激。
谢谢,普拉萨德
这取决于您捕获它们的方式/位置。通常,您希望像这样指定一个<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)端执行业务逻辑被认为是不好的做法的原因之一。