最佳实践:JSP Servlets 中的错误处理

6
我有一个相当简单的Web应用程序,使用JSP / servlets连接到Oracle数据库。目前该应用程序只有少数几个页面,但正在不断增长。
截至目前,我没有任何显示用户错误的东西。例如,如果数据库连接失败,页面就会是空白的。我想知道处理错误的最佳实践是什么?我应该打印出堆栈跟踪吗?所有错误都应该转到默认错误页面吗?
如有建议或参考资料,将不胜感激。正如您可能已经注意到的,这对我来说还相当新颖。
谢谢

显然这取决于很多因素,比如是在公司内部网络还是互联网上。在内部网络上显示更多的错误信息比在互联网上更有意义。 - developerwjk
1个回答

5
对于那些被认为是无法恢复的错误(例如数据库连接问题),这些错误通常在应用程序的最高级别中捕获并在一个地方处理。许多框架将其转换为未经检查的异常,以避免中间层处理它们。
对于这些不可恢复的异常,通常会向用户显示一个友好且相当通用的错误页面,并将堆栈跟踪(包含更详细的信息)发送到日志文件中 - 供系统管理员和/或开发人员查询。
Servlet规范提供了一种通过web.xml标签来处理错误的方法。
如果你使用的是Servlet 3.0或以上版本,则可以在web.xml中添加以下内容:
<error-page>
    <location>/error.html</location>
</error-page>

这将捕获所有未处理的异常并将它们发送到Web应用程序根目录下的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。这将使应用程序更易于管理,并提供一致和明确定义的错误处理机制。


2
+1. 在JSP页面中最好避免使用脚本语句(即Java代码)。要访问JSP页面中的错误/异常相关信息,最好使用表达式语言和内置对象。在这里,OP可以找到一个404 JSP错误页面的例子:如何在JSP错误页面中显示请求的URL? - informatik01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接