JSP Servlet中的最佳实践错误处理

Joh*_*Lee 5 error-handling jsp servlets exception-handling

我在Oracle数据库上使用jsp/servlets有一个非常简单的Web应用程序.该应用程序目前只有少量页面,但它正在增长.

截至目前,我没有任何显示用户错误的东西.例如,如果数据库连接失败,则页面只是空白.我很好奇错误处理的最佳做法是什么?我应该打印出堆栈跟踪吗?所有错误都应该转到默认错误页面吗?

任何建议或参考资料将不胜感激.你可能会说,这对我来说是个新鲜事.

谢谢

Wil*_*ing 5

对于被认为不可恢复的错误(例如数据库连接问题),这些类型的错误通常在应用程序的最顶层捕获并在一个地方处理。许多框架会将这些转换为未经检查的异常以避免中间层不得不处理它们。

对于这些不可恢复的异常,通常您会向用户显示一个用户友好且相当通用的错误页面,并将堆栈跟踪(包含更详细的信息)发送到日志文件 - 供系统管理员和/或开发人员询问。

servlet 规范提供了一种通过web.xmlvia theerror-page标记处理错误的方法。

如果您使用的是 Servlet 3.0 或更高版本,则web.xml可以在其中添加:

<error-page>
    <location>/error.html</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)

这将捕获所有未处理的异常并将它们发送到error.htmlweb 应用程序根目录中的页面。

在 servlet 规范的早期版本中,您必须指定异常类型或错误代码(您仍然可以这样做以进行更细粒度的错误处理):

<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/error.html</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)

或者:

<error-page>
    <error-code>500</error-code>
    <location>/error.html</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)

和:

<error-page>
    <error-code>404</error-code>
    <location>/notFound.html</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)

另外,如果您需要在错误页面中进行动态处理,您可以转发到另一个 JSP(或另一个 servlet):

<error-page>
    <error-code>500</error-code>
    <location>/WEB-INF/jsp/error.jsp</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)

如果您需要从错误页面内部访问异常(也许您想显示异常保存的某些特定数据 - 例如代码),那么您可以通过javax.servlet.error.exceptionrequest 属性访问原始异常:

Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
Run Code Online (Sandbox Code Playgroud)

如果您的应用程序在不断增长,您最好转向 MVC 框架(例如Spring MVC),这将使您的应用程序的构建更易于管理——此外,它还将为错误处理提供一致且定义明确的机制。

  • +1。唯一的事情是[最好避免使用脚本](http://stackoverflow.com/a/3180202/814702)(即 JSP 页面中的 Java 代码)。并且要访问 JSP 页面中的错误/异常相关信息,最好使用 [Expression Language](http://stackoverflow.com/tags/el/info) 和 [*implicit objects*](http://docs .oracle.com/javaee/5/tutorial/doc/bnahq.html#bnaij)。在这里 OP 可以找到 404 JSP 错误页面的示例:[如何在 JSP 错误页面中显示请求的 URL?](http://stackoverflow.com/a/14300521/814702) (2认同)