【问题标题】:where to handle spring DataAccessException在哪里处理spring DataAccessException
【发布时间】:2012-05-27 05:35:53
【问题描述】:
我使用 Struts、Spring 和 Hibernate 开发了一个应用程序。
我的 DAO 使用 spring jdbc,它的所有方法都抛出 DataAccessException(即未检查)。
我应该在哪里处理这个异常?我知道这是一个未经检查的异常,但我认为我需要告诉用户数据库或连接是否有问题。
我认为我应该从我的服务类方法中重新抛出 DataAccessException 以被 Controller 捕获。
这是一个好习惯吗?
我查看了 Spring 包中的示例,在域或服务区域中没有发现任何异常处理。离开 dao 区域后,DataAccessException 似乎被忽略了。
请为这个问题提出一个好的设计。
【问题讨论】:
标签:
spring
exception-handling
struts
dao
data-access
【解决方案1】:
离开 dao 区域后,DataAccessException 似乎被忽略了。
这是一件好事!让它飞过整个堆栈。您可能在服务层上有事务 - 异常将透明地导致最外层事务回滚。太好了!
现在它将找到通往控制器的路。如果你在 Struts 控制器中捕获它,你可以例如返回不同的视图。但很可能您不想在每个 Struts 操作中处理异常。所以让异常飞得更远。在某些时候,Struts 会捕获该异常并尝试处理它。 Struts 有一些复杂的错误处理机制,你会发现很多关于它们的信息。通常,它会根据异常类型调用一些自定义操作或错误屏幕。
最后,如果连 Struts 都无法处理异常,它会被重新抛出到容器中,导致返回 HTTP 503 并返回异常详细信息。
如您所见,您可以在很多级别上控制异常,通常越低越好。
【解决方案2】:
抛出异常也是一项代价高昂的操作。
在服务层本身捕获异常并根据异常生成响应并将其发送到控制器是一个不错的选择。
在开发应用程序时,开发人员总是更好地了解他/她必须处理哪种类型的异常。因此捕获异常并将其转换为适当的响应是一个不错的选择。