sqlexception 的 geterrorcode() 返回数据库厂商定义的错误码而非 sql 标准码,需结合 getsqlstate() 使用,并遍历异常链获取首个非零码,避免硬编码数字及忽略嵌套异常。

在 Java 中,SQLException 的 getErrorCode() 方法返回的是数据库厂商定义的错误码(如 MySQL 的 1062、Oracle 的 1 或 PostgreSQL 的 23505),但要注意:它**不是 SQL 标准状态码(SQLState)**,且不同驱动实现可能有差异。正确提取的关键在于——先确认异常是否为 SQLException 类型,再调用该方法,同时需注意嵌套异常链。
直接调用 getErrorCode() 并处理 null/0 情况
getErrorCode() 可能返回 0(表示未知或未定义)或负数(某些驱动如 PostgreSQL JDBC 返回 -1 表示无映射码),不能默认当作有效业务判断依据。建议结合 getSQLState() 一起使用:
- 捕获时用
catch (SQLException e),避免向上转型丢失信息 - 调用
e.getErrorCode()前,不需判空(该方法永不返回 null) - 若返回值为 0,应 fallback 到
e.getSQLState()(如 "23000" 表示完整性约束违规)
遍历 SQLException 链获取根错误码
SQLException 支持链式异常(getNextException()),尤其在批量操作或连接池场景中,真实错误码可能在链尾。推荐用循环提取第一个非零 error code:
- 用
for (SQLException se = e; se != null; se = se.getNextException())遍历 - 遇到
se.getErrorCode() != 0就立即返回,避免被中间层覆盖 - 若整条链都为 0,再考虑
e.getSQLState()的前两位(如 "23" 表示 integrity constraint violation)
按数据库类型做适配性判断
不同数据库的 error code 含义不同,硬编码数字易出错。例如:
- MySQL:1062(重复键)、1216(外键约束失败)
- PostgreSQL:23505(唯一约束)、23503(外键不存在)
- Oracle:1(主键冲突)、2292(子记录存在导致删除失败)
- 建议封装工具方法,根据
e.getSQLState()或e.getSQLState().startsWith("23")统一识别约束类错误
避免常见陷阱
以下做法容易导致提取失败或误判:
- 对
Exception或RuntimeException捕获后强转SQLException—— 可能 ClassCastException - 只检查最外层异常,忽略
getNextException()中的真实错误 - 把
getErrorCode()和getSQLState()混用,比如用 MySQL 的 1062 去匹配 PostgreSQL 的行为 - 日志中只打
e.getMessage(),漏掉 error code 和 SQLState,增加排查难度
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











