对于被认为不可恢复的错误(例如数据库连接问题),这类错误通常会在应用程序的最顶层捕获并在一个地方进行处理。许多框架会将这些转换为未经检查的异常,以避免中间层不得不处理它们。
对于这些不可恢复的异常,通常您会向用户显示一个用户友好且相当通用的错误页面,并将堆栈跟踪(包含更详细的信息)发送到日志文件 - 以供系统管理员和/或开发人员查询。
servlet 规范提供了一种通过web.xml 和error-page 标记处理错误的方法。
如果您使用的是 Servlet 3.0 或更高版本,那么您可以在 web.xml 中添加:
<error-page>
<location>/error.html</location>
</error-page>
这将捕获所有未处理的异常并将它们发送到 webapp 根目录中的 error.html 页面。
在 servlet 规范的早期版本中,您必须指定异常类型或错误代码(您仍然可以这样做以进行更细粒度的错误处理):
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error.html</location>
</error-page>
或者:
<error-page>
<error-code>500</error-code>
<location>/error.html</location>
</error-page>
还有:
<error-page>
<error-code>404</error-code>
<location>/notFound.html</location>
</error-page>
另外,如果您需要在错误页面中进行动态处理,您可以转发到另一个 JSP(或另一个 servlet):
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/jsp/error.jsp</location>
</error-page>
如果您需要从错误页面内部访问异常(也许您想显示异常所持有的一些特定数据 - 例如代码),那么您可以通过 javax.servlet.error.exception 请求属性访问原始异常:
Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
如果您的应用程序正在增长,您最好迁移到 MVC 框架 - 例如 Spring MVC - 这将使您的应用程序更易于管理 - 而且它将提供一致且定义明确的错误处理机制。