2010-01-30 53 views
20

我正在开发一个中等大小的Java Web应用程序,其中使用Struts作为MVC框架和数据访问层的简单JDBC。我一直在寻找这种应用程序中的异常处理最佳实践。我发现了几篇文章,其中有些文章是矛盾的,只会让我更加困惑,而不是把事情弄清楚和简单。有人说,重复使用现有的异常而不是定义特定于应用程序的异常会更好,其他人则会针对系统中可能出现的每一个小问题展示巨大的应用程序特定异常层次。有人说最好不要在数据访问层处理异常并将它们委托给服务层,另一些人则认为数据访问层异常应该在本地捕获,因为将它们委托给服务层会违反两层之间的抽象。等等。Java Web应用程序中的异常处理

如果你让我知道文章/书籍的链接/名称,以表明在这种情况下为你工作的固体解决方案,我将非常感激。解决方案应该至少清除以下几点,并说明理由:

  1. 哪里发现SQLE错误?
  2. 如何记录异常?
  3. 是否应该记录未检查的异常?
  4. 应该在表示层捕获未经检查的异常,并且它们是否应该显示给用户?
  5. 如何检查异常处理,哪些要显示给用户以及如何处理?
  6. 应该如何使用全局异常处理程序页面?
  7. 在这种情况下应该如何使用struts ActionErrors?

感谢

回答

18

1:哪里发现SQLExceptions?

在数据访问层的DAO类。如有必要,可以用自定义的DAO异常包装它。这个DAO异常又需要作为检查异常进一步处理。

2:哪里应该记录异常?

当你到达throw或者通过消息框架。

3:是否应该记录未经检查的异常?

他们当然应该被记录。它们应该是而不是发生在现实世界中,因为这些都是代码逻辑(即开发人员故障)中的故障的迹象,需要尽快修复。应将它们一直扔到容器中,让容器用<error-page>web.xml中处理它们。要记录(并最终发送邮件),请使用在错误页面上侦听的Filter

4:应该在表示层捕获未检查的异常,并且它们是否应该显示给用户?

它们不应该发生。

5:如何检查异常处理,哪些要显示给用户以及如何处理?

如果它们是错误的用户输入(例如不是数字,错误的电子邮件,违反约束等)的结果,则以与用户相同的形式显示它们。否则(例如数据库关闭,DAO异常等)要么一直抛出错误页面,要么显示错误消息并稍后重试。

6:应该如何使用全局异常处理程序页面?

至少以用户友好的方式。因此,在相同的布局中,有一些介绍性的“对不起”,如有必要,还有一些错误细节和电子邮件地址,以便用户可以联系这种情况。

7:如何在此上下文中使用struts ActionErrors?

以相同的形式向用户展示它们。

+0

谢谢你的回应。 关于#3,如果筛选器在错误页面上侦听,我们如何捕获Filter中未处理的异常? – craftsman 2010-01-31 13:17:18

+0

它存储为请求属性,名称为“exception”。另一方面,你也可以通过在try/catch块中放置'chain.doFilter(request,response)'来处理异常并转发到错误页面。 – BalusC 2010-01-31 17:46:40

3

如果你不能从异常中恢复,那么你就应该让它(通过使选择它,或在未经检查的异常包装往往)要流出来的代码。如果他们仍然被检查,你必须在你的代码的每个级别,并因此在每个抽象层上迎合他们。 SQLExceptions通常会属于这个类别(因为它们被选中,你必须包装它们)。

对于这些例外情况,我通常登录最高级别,但向用户展示一个页面,只是详细说明某些东西出错了。通常我的用户对堆栈跟踪不感兴趣。但我通常为他们提供一个页面让他们描述他们当时正在做什么,并且记录的异常通过唯一的id(记录在表单和日志文件中除外)与此提交相关联。这使我可以将用户的行为与产生的异常联系起来。

上面假设你不能从SQLExceptions中恢复,并且如果数据库关闭,那么你不能做一些有意义的事情。当然,这也有例外。您可能会发现您正在与多个系统通话,而一个系统正在关闭并不意味着您无法以某种方式继续(例如,据报道,亚马逊主页依赖于100个服务,无论其中有些服务是否需要运行下)。

我认为声明异常与定义它们的接口/方法处于相同的抽象层次。例如一个TradeStore将被宣布为抛出TradeException,而不是SQLException(因为存储交易的方法是TradeStore的实现 - 您可以存储在关系数据库,JavaSpace等中)。

+0

谢谢Brian。 TradeStore示例+1。 – craftsman 2010-01-31 13:29:11

1

作为警告,向用户显示较低级别的错误消息时,请确保它们已经过系统信息清理。这是许多安全漏洞的起源地区。用完整信息记录它们,但仅向用户显示更一般的错误消息。