Java 如何捕获JDBC中的特定异常?

Java 如何捕获JDBC中的特定异常?,java,jdbc,Java,Jdbc,如何捕获中的特定异常?示例:主键异常或外键异常。包含一些与异常相关的数据库特定信息。从文档: 每个SQLException都提供几个 信息种类: 1) 一串 描述错误。这被用作 Java异常消息,可用 通过getMesage方法 2) “SQLstate” 字符串,该字符串位于XOPEN SQLstate约定还是sql99 习俗。价值观 SQLState字符串在 数据库元数据的适当规范 方法getSQLStateType可用于 发现驱动程序是否返回 XOPEN类型或SQL 99类型 3) 一个

如何捕获中的特定异常?示例:主键异常或外键异常。

包含一些与异常相关的数据库特定信息。从文档:

每个SQLException都提供几个 信息种类:

1) 一串 描述错误。这被用作 Java异常消息,可用 通过getMesage方法

2) “SQLstate” 字符串,该字符串位于XOPEN SQLstate约定还是sql99 习俗。价值观 SQLState字符串在 数据库元数据的适当规范 方法getSQLStateType可用于 发现驱动程序是否返回 XOPEN类型或SQL 99类型

3) 一个 特定于的整数错误代码 每个供应商。通常情况下,这将是 服务器返回的实际错误代码 底层数据库

4) 连锁店 例外。这可以用来提供 其他错误信息


Brian是对的,几乎所有JDBC问题都会抛出SQLException。这就是JDBC如此令人讨厌的部分原因。提供一个查看SQLCode、SQLState等的方法,并抛出相应的。有许多这样的异常类,它们让您更好地了解出了什么问题,它们的名称包括DataIntegrityViolationException、DataSourceLookupFailureException、PermissionDeniedDataAccessException、,处理
SQLException
的最佳且与数据库无关的方法更具体地说是确定可通过以下方式获得的SQL状态代码。SQLState是一个5字符的代码,前两个在所有数据库中都是通用的,后三个可能会根据数据库和/或特定条件而有所不同。以下是摘自:

  • 02:没有数据
  • 07:动态SQL错误
  • 08:连接异常
  • 0A:不支持此功能
  • 21:基数违反
  • 22:数据异常
  • 23:完整性约束冲突
  • 24:无效的游标状态
  • 25:无效事务状态
  • 26:无效的SQL语句名称
  • 28:无效的授权规范
  • 2B:依赖特权描述符仍然存在
  • 2C:无效的字符集名称
  • 2D:无效的事务终止
  • 2E:连接名称无效
  • 33:无效的SQL描述符名称
  • 34:无效的游标名称
  • 35:无效条件编号
  • 3C:游标名称不明确
  • 3D:目录名称无效
  • 3F:架构名称无效
因此,要确定SQL异常是否由约束冲突引起,您可以在(虚拟的)
SQLUtil
类中执行以下操作:

public static boolean isConstraintViolation(SQLException e) {
    return e.getSQLState().startsWith("23");
}
下面是SQL:2011标准指定的所有类和子类的更完整、最新列表。我最近刚刚整理了这份清单

+----+-----------------------------------------------------------+-----+--------------------------------------------------------------+
|类和类描述|子类和子类描述|
+----+-----------------------------------------------------------+-----+--------------------------------------------------------------+
|00 |成功完成| 000 |无子类|
|01 |警告| 000 |无子类|
|01 |警告| 001 |光标操作冲突|
|01 |警告| 002 |断开错误|
|01 |警告| 003 |设定功能中消除空值|
|01 |警告| 004 |字符串数据,右截断|
|01 |警告| 005 |项目描述符区域不足|
|01 |警告| 006 |特权未被撤销|
|01 |警告| 007 |未授予特权|
|01 |警告| 009 |信息架构的搜索条件太长|
|01 |警告| 00A |查询表达式对于信息架构太长|
|01 |警告| 00B |默认值对于信息架构太长|
|01 |警告| 00C |返回结果集|
|01 |警告| 00D |返回其他结果集|
|01 |警告| 00E |尝试返回太多结果集|
|01 |警告| 00F |语句对于信息架构太长|
|01 |警告| 012 |条件数无效|
|01 |警告| 02F |数组数据,右截断|
|02 |无数据| 000 |无子类|
|02 |无数据
try {

// Your code here

} catch(SQLException ex){
    if(ex instanceof SQLIntegrityConstraintViolationException) {
          // Handle Here
    }
}