【问题标题】:Best practice error handling in JSP ServletsJSP Servlet 中的最佳实践错误处理
【发布时间】:2013-12-21 09:37:31
【问题描述】:

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

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

任何建议或参考材料将不胜感激。你可能会说,这对我来说有点新鲜。

谢谢

【问题讨论】:

  • 显然这取决于很多东西,比如这是在公司内部网还是互联网上。在 Intranet 上显示比在 Internet 上更多的错误信息是有意义的。

标签: jsp servlets exception-handling error-handling


【解决方案1】:

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

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

servlet 规范提供了一种通过web.xmlerror-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 - 这将使您的应用程序更易于管理 - 而且它将提供一致且定义明确的错误处理机制。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-09-12
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 2016-06-06
  • 1970-01-01
相关资源
最近更新 更多