是否有一种标准方法来捕获发生在 java servlet 容器(如 tomcat 或 Jetty)内的未捕获异常?我们运行了很多来自库的 servlet,因此我们不能轻易地使用 try/catch 代码。通过提供的 API 以尽可能通用的方式捕获并记录我们的 Web 应用程序(在 Jetty 中运行)中所有未捕获的异常到我们的错误跟踪器,这也是很好的。
请不要我只需要记录异常,是否重定向到自定义错误页面对我没有帮助。我们通过 GWT-RPC 完成所有操作,因此用户永远不会看到错误页面。
是否有一种标准方法来捕获发生在 java servlet 容器(如 tomcat 或 Jetty)内的未捕获异常?我们运行了很多来自库的 servlet,因此我们不能轻易地使用 try/catch 代码。通过提供的 API 以尽可能通用的方式捕获并记录我们的 Web 应用程序(在 Jetty 中运行)中所有未捕获的异常到我们的错误跟踪器,这也是很好的。
请不要我只需要记录异常,是否重定向到自定义错误页面对我没有帮助。我们通过 GWT-RPC 完成所有操作,因此用户永远不会看到错误页面。
我认为自定义过滤器实际上效果最好。
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
chain.doFilter(request, response);
} catch (Throwable e) {
doCustomErrorLogging(e);
if (e instanceof IOException) {
throw (IOException) e;
} else if (e instanceof ServletException) {
throw (ServletException) e;
} else if (e instanceof RuntimeException) {
throw (RuntimeException) e;
} else {
//This should never be hit
throw new RuntimeException("Unexpected Exception", e);
}
}
}
在web.xml
(部署描述符)中,您可以使用该<error-page>
元素按异常类型或HTTP 响应状态代码指定错误页面。例如:
<error-page>
<error-code>404</error-code>
<location>/error/404.html</location>
</error-page>
<error-page>
<exception-type>com.example.PebkacException</exception-type>
<location>/error/UserError.html</location>
</error-page>
有关以 NetBeans 为中心的描述,请继续阅读配置 Web 应用程序:将错误映射到错误屏幕(Java EE 6 教程)(或参见Java EE 5 教程的版本)。
不是 100% 确定这是否适用于 servlet 容器,或者此调用需要在上游多远,但您可以调用静态 setDefaultUncaughtExceptionHandler方法Thread
来设置一个处理程序来处理所有未捕获的异常。