Spring DAO异常体系类非常丰富,这里,我们仅列出DataAccessException异常类下的子类。我们可以很容易地通过异常类的名字了解到异常所代表的语义。我们通过下表对这些异常进行简单的描述:
表 1 Spring DAO异常体系类
|
异常
|
说明
|
|
CleanupFailureDataAccessException
|
DAO操作成功执行,但在释放数据资源时发生异常,如关闭Connection时发生异常等。
|
|
ConcurrencyFailureException
|
表示在进行并发数据操作时发生异常,如乐观锁无法获取、悲观锁无法获取、死锁引发的失败等待异常。
|
|
DataAccessResourceFailureException
|
访问数据资源时失败,如无法获取数据连接,无法获取Hibernate的会话等。
|
|
DataRetrievalFailureException
|
获取数据失败,如找不到对应主键的数据,使用了错误的列索引等。
|
|
DataSourceLookupFailureException
|
无法从JNDI中查找到数据源。这个异常是Spring 2.0新增的。
|
|
DataIntegrityViolationException
|
当数据操作违反了数据一致性限制时抛出的异常,如插入重复的主键,引用不存在的外键等。
|
|
InvalidDataAccessApiUsageException
|
不正确地调用某一持久化技术时抛出的异常,如在Spring JDBC中查询对象在调用前必须进行编译操作,如果忘记这项操作将会产生该异常。这种异常不是由底层数据资源产生,而是由不正确地使用持久化技术产生的。
|
|
InvalidDataAccessResourceUsage
|
在访问数据源时使用了不正确的方法所抛出的异常,如SQL语句错误将抛出该异常。
|
|
PermissionDeniedDataAccessException
|
数据访问时由于权限不足引发的异常。如用仅拥有只读权限用户试图进行数据更改操作将抛出该异常。该异常是Spring 2.0新增的。
|
|
UncategorizedDataAccessException
|
其它未分类的异常都归到该异常中。
|
为了进一步细化错误的问题域,Spring对一级异常类进行子类的细分,如InvalidDataAccessResourceUsageException就拥有10多个子类,下面是其中3个子类:
图 3 一级异常类的细化
对于InvalidDataAccessResourceUsageException异常,不同的持久化实现技术均有对应的子异常类。如 BadSqlGrammarException对应JDBC实现技术SQL语句语法错误的异常,而HibernateQueryExcpetion和TopLinkQueryException分别对应Hibernate和TopLink实现技术的查询语法异常。
Spring的这个异常体系具有高度的可扩展性,当Spring需要对一个新的持久化技术提供支持时,只要定义为其定义一个对应的子异常就可以了,这种更改完全满足设计模式中的开-闭原则。
虽然Spring定义了如此丰富的异常类,作为开发人员,我们仅需要对感兴趣的异常进行处理就可以了。假设某一个项目要求在发生乐观锁异常时,尝试再次获取乐观锁非不是直接返回错误。那么,我们只需要在代码中显式捕捉ConcurrencyFailureException异常,然后在catch代码块中编写满足需求的逻辑即可。其它众多的异常则可以简单地交由框架自动处理(如发生运行期异常时自动回滚事务)。