SQLException 提供了几种获取错误码的手段。但具体用哪个、怎么用,取决于底层JDBC驱动和数据库厂商。这里梳理一下几个关键方法,方便在实际开发中快速定位问题。
使用 getSQLState() 获取 SQL 标准状态码
这是跨数据库最通用的方式。它返回一个5位字符串,遵循SQL标准(SQLSTATE),比如"23505"代表唯一约束冲突。主流驱动如PostgreSQL、H2、Derby都支持,MySQL 8.0+也已经跟上。
- 相比厂商错误码,
getSQLState()可移植性更好,适合做通用逻辑判断。例如,唯一约束冲突通常是"23505",外键违约为"23503"。 - 调用方式:
e.getSQLState(),其中e是捕获的SQLException。 - 需要注意:部分旧版驱动(比如老版本MySQL Connector/J)可能返回
null或占位符(如"00000"),建议实际测试验证。
使用 getErrorCode() 获取数据库厂商错误码
getErrorCode() 返回的是数据库厂商定义的整数码,意义完全取决于数据库文档。比如MySQL的1062表示重复键,Oracle的1对应ORA-00001,而PostgreSQL通常返回0,表示无厂商码。
- MySQL:参考官方错误码列表,比如1062 = “Duplicate entry”。
- PostgreSQL:实际返回的是SQLSTATE的十进制映射,一般不直接使用;建议优先看
getSQLState()。 - Oracle:返回ORA-XXXXX中的数字部分,比如1对应ORA-00001。
查看原始错误消息辅助定位
e.getMessage() 或 e.toString() 包含驱动生成的可读提示,往往同时包含SQLSTATE和厂商码。比如PostgreSQL的报错中会同时出现SQLSTATE: 23505和ERROR: duplicate key value violates unique constraint。
- 适合日志记录和人工排查,是快速定位问题入口。
- 不建议用于程序逻辑判断——容易受本地化、格式变动影响,不够稳定。
遍历 SQLException 链获取完整错误信息
有些数据库操作,比如批处理或存储过程,可能抛出多个嵌套异常。这时候,getNextException() 就得派上用场了,它能遍历整个异常链,避免只捕获第一个错误而遗漏根本原因。
- 每个节点都可以独立调用
getSQLState()和getErrorCode()。 - 实际开发中,建议循环处理
SQLException链,确保不丢失关键信息。

