2012-01-30 53 views
1

例如:我们有基于MVC的Web应用程序。此外,我们使用这个应用程序:Spring,Struts 2Hibernate框架。Java:MVC项目中的错误处理。如何正确实施?

让我们看看小场景:用户尝试保存一些instanse,例如:BO Book。

因此,用户填写表单域和发送请求到服务器:

发生了什么事在服务器上?

  • 执行动作方法Action.Save();
  • 内部Action.Save()呼叫Service.save();
  • Inside Service.save()致电DaoHibernate.save();
  • Inside DaoHibernate.save()致电getHibernateTemplate().save();

方法getHibernateTemplate.save() - 它是框架实现,所以我们不能访问这个方法。我们只知道,如果在此方法内部出现故障,则会引发DataAccessException

那么,在这一刻我想,如何正确实现我的日志记录和错误处理?

在哪个级别?

On Dao level?服务水平?

还是关于Struts的行为?

您对此有何看法?

还是需要每个级别?

您可以推荐哪些最佳实践?

回答

3

这里是你的架构:

enter image description here

你怎么想手柄 DAO层上的错误?返回假数据?空集合?如果你不能,就让异常弹出。

如何处理服务层?您知道数据库不能正常工作,那么您可以返回到Struts操作?一个空的结果?一个错误对象?是不是例外的错误对象?

所以异常出现在Struts动作中。在这里你有一些选择。如果异常实际上告诉用户某些事情并且您的GUI已准备好,则可以返回不同的视图(并在此处记录异常)。

但是如果在Struts动作中发现NullPointerException?你会在每个Struts操作中分别处理它吗?不,所以更进一步传递异常(!)

我觉得你的想法 - 只要你不知道如何处理(和记录不处理)外,让客户端清理残局。否则,您只有隐藏问题并增加损失(例如,交易不回滚,用户看到不正确的结果)。

我会建议实施generic异常处理机制,它记录异常并向用户返回HTTP 500。温和的错误信息(没有堆栈跟踪)应该出现,用户应该道歉。您应该调查到达此层的每个错误。据我所知,Struts(以及几乎每个Web框架)都有一些集中处理异常的方法。 (Struts 2 Exception Handling Docs

+0

很棒的图!谢谢! – user471011 2012-01-30 15:52:00