异常处理
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
受检异常与非受检异常
关于它们的优缺点已经被多次讨论,并且在今天这主要仍然是一个品味的问题。在这个主题中,jOOQ 明确地站在一边。jOOQ 的异常策略很简单
- 所有“系统异常”都是非受检异常。如果在涉及业务逻辑的事务中间,你无法从丢失的数据库连接或表明你对数据库模型理解有误的约束冲突中合理地恢复。
- 所有“业务异常”都是受检异常。业务异常是真正的异常,你应该处理(例如,没有足够的资金来完成交易)。其他语言可能具有 联合类型或 Monad 来实现相同的行为,减去异常的控制流影响。
使用 jOOQ,它很简单。jOOQ 的所有异常都是“系统异常”,因此它们都是非受检异常。
jOOQ 的 DataAccessException
jOOQ 使用自己的 org.jooq.exception.DataAccessException
来包装任何底层的 java.sql.SQLException
。请注意,jOOQ 中大多数可能导致 DataAccessException 的方法都在 Javadoc 以及它们的方法签名中记录了这一点,即使这不是 Java 语言中非受检异常的要求。
DataAccessException 有多个子类型,如下所示
-
ConfigurationException
:org.jooq.Configuration
的设置方式不允许特定的操作。 -
DataAccessException
: 通常源自java.sql.SQLException
的一般异常 -
DataChangedException
: 指示数据库的底层记录在一段时间内已更改的异常(请参阅 乐观锁定) -
DataDefinitionException
: 在 解释 DDL 语句 时发生异常。 -
DataTypeException
: 类型转换期间出现问题 -
DataException
: jOOQ 等效于 JDBC 的java.sql.SQLDataException
。 -
DetachedException
: 在“分离的” UpdatableRecord 或“分离的” SQL 语句 上执行了 SQL 语句。 -
IntegrityConstraintViolationException
: jOOQ 等效于 JDBC 的java.sql.SQLIntegrityConstraintViolationException
。 -
InvalidResultException
: 执行的操作预期只有一个结果,但返回了多个结果。 -
LoaderConfigurationException
: 使用非法加载器配置执行了 Loader API。 -
MappingException
: 从 POJO 加载记录或将记录映射到 POJO 时出现问题 -
NoDataFoundException
: 当需要恰好一行时,没有从org.jooq.ResultQuery
返回任何行。 -
TemplatingException
: 在进行 plain SQL 模板化 时发生异常。 -
TooManyRowsException
: 当最多需要一行时,从org.jooq.ResultQuery
返回了多行。
覆盖 jOOQ 的异常处理
以下关于 执行监听器 的部分记录了覆盖 jOOQ 异常处理的方法,如果你希望分别处理某些类型的约束冲突,或者如果你从数据库引发业务错误等。
反馈
您对此页面有任何反馈吗?我们很乐意听到您的意见!