如何捕捉JDBC中的特定例外情况?示例:主键异常或外键异常。
答案 0 :(得分:25)
更具体地说,处理SQLException
的最佳且与数据库无关的方法是确定可以通过SQLException#getSQLState()
获得的SQL状态代码。 SQLState是一个5-char代码,其中前两个在所有DB中是通用的,后三个可能根据DB和/或特定条件而不同。以下是spec:
因此,要确定SQL异常是否由约束违规引起,您可以在(虚构)SQLUtil
类中执行以下操作:
public static boolean isConstraintViolation(SQLException e) {
return e.getSQLState().startsWith("23");
}
答案 1 :(得分:7)
SQLException包含与异常相关的一些特定于数据库的信息。来自doc:
每个SQLException都提供了几个 各种信息:
1)一个字符串 描述错误。这被用作 Java异常消息,可用 通过方法getMesage。
2)“SQLstate” 字符串,它跟在XOPEN之后 SQLstate约定或SQL 99 约定。的价值观 SQLState字符串在中描述 适当的规格。 DatabaseMetaData 方法getSQLStateType可以用来 发现司机是否返回 XOPEN类型或SQL 99类型。
3)a 特定于的整数错误代码 每个供应商。通常这将是 由...返回的实际错误代码 底层数据库。
4)链接到下一个 例外。这可以用来提供 其他错误信息。
答案 2 :(得分:5)
Brian是的,对于任何JDBC问题都会抛出SQLException。这就是为什么JDBC如此烦人的部分原因。 Spring library JDBC helpers提供exception translator来查看SQLCode,SQLState等,并抛出相应的DataAccessException。这些异常类有很多,它们可以让您更好地了解出现了什么问题,例如DataIntegrityViolationException,DataSourceLookupFailureException,PermissionDeniedDataAccessException等。
答案 3 :(得分:4)
关注BalusC's answer,这是SQL:2011标准指定的所有类和子类的更完整的最新列表。我刚刚为Javadoc of jOOQ's SQLStateSubclass
汇总了这个列表。
+----+-----------------------------------------------------------+-----+--------------------------------------------------------------+
| Class and class description | Subclass and subclass description |
+----+-----------------------------------------------------------+-----+--------------------------------------------------------------+
| 00 | Successful completion | 000 | No subclass |
| 01 | Warning | 000 | No subclass |
| 01 | Warning | 001 | Cursor operation conflict |
| 01 | Warning | 002 | Disconnect error |
| 01 | Warning | 003 | Null value eliminated in set function |
| 01 | Warning | 004 | String data, right truncation |
| 01 | Warning | 005 | Insufficient item descriptor areas |
| 01 | Warning | 006 | Privilege not revoked |
| 01 | Warning | 007 | Privilege not granted |
| 01 | Warning | 009 | Search condition too long for information schema |
| 01 | Warning | 00A | Query expression too long for information schema |
| 01 | Warning | 00B | Default value too long for information schema |
| 01 | Warning | 00C | Result sets returned |
| 01 | Warning | 00D | Additional result sets returned |
| 01 | Warning | 00E | Attempt to return too many result sets |
| 01 | Warning | 00F | Statement too long for information schema |
| 01 | Warning | 012 | Invalid number of conditions |
| 01 | Warning | 02F | Array data, right truncation |
| 02 | No data | 000 | No subclass |
| 02 | No data | 001 | No additional result sets returned |
| 07 | Dynamic SQL Error | 000 | No subclass |
| 07 | Dynamic SQL Error | 001 | Using clause does not match dynamic parameter specifications |
| 07 | Dynamic SQL Error | 002 | Using clause does not match target specifications |
| 07 | Dynamic SQL Error | 003 | Cursor specification cannot be executed |
| 07 | Dynamic SQL Error | 004 | Using clause required for dynamic parameters |
| 07 | Dynamic SQL Error | 005 | Prepared statement not a cursor specification |
| 07 | Dynamic SQL Error | 006 | Restricted data type attribute violation |
| 07 | Dynamic SQL Error | 007 | Using clause required for result fields |
| 07 | Dynamic SQL Error | 008 | Invalid descriptor count |
| 07 | Dynamic SQL Error | 009 | Invalid descriptor index |
| 07 | Dynamic SQL Error | 00B | Data type transform function violation |
| 07 | Dynamic SQL Error | 00C | Undefined DATA value |
| 07 | Dynamic SQL Error | 00D | Invalid DATA target |
| 07 | Dynamic SQL Error | 00E | Invalid LEVEL value |
| 07 | Dynamic SQL Error | 00F | Invalid DATETIME_INTERVAL_CODE |
| 08 | Connection exception | 000 | No subclass |
| 08 | Connection exception | 001 | SQL-client unable to establish SQL-connection |
| 08 | Connection exception | 002 | Connection name in use |
| 08 | Connection exception | 003 | Connection does not exist |
| 08 | Connection exception | 004 | SQL-server rejected establishment of SQL-connection |
| 08 | Connection exception | 006 | Connection failure |
| 08 | Connection exception | 007 | Transaction resolution unknown |
| 09 | Triggered action exception | 000 | No subclass |
| 0A | Feature not supported | 000 | No subclass |
| 0A | Feature not supported | 001 | Multiple server transactions |
| 0D | Invalid target type specification | 000 | No subclass |
| 0E | Invalid schema name list specification | 000 | No subclass |
| 0F | Locator exception | 000 | No subclass |
| 0F | Locator exception | 001 | Invalid specification |
| 0L | Invalid grantor | 000 | No subclass |
| 0M | Invalid SQL-invoked procedure reference | 000 | No subclass |
| 0P | Invalid role specification | 000 | No subclass |
| 0S | Invalid transform group name specification | 000 | No subclass |
| 0T | Target table disagrees with cursor specification | 000 | No subclass |
| 0U | Attempt to assign to non-updatable column | 000 | No subclass |
| 0V | Attempt to assign to ordering column | 000 | No subclass |
| 0W | Prohibited statement encountered during trigger execution | 000 | No subclass |
| 0W | Prohibited statement encountered during trigger execution | 001 | Modify table modified by data change delta table |
| 0Z | Diagnostics exception | 000 | No subclass |
| 0Z | Diagnostics exception | 001 | Maximum number of stacked diagnostics areas exceeded |
| 21 | Cardinality violation | 000 | No subclass |
| 22 | Data exception | 000 | No subclass |
| 22 | Data exception | 001 | String data, right truncation |
| 22 | Data exception | 002 | Null value, no indicator parameter |
| 22 | Data exception | 003 | Numeric value out of range |
| 22 | Data exception | 004 | Null value not allowed |
| 22 | Data exception | 005 | Error in assignment |
| 22 | Data exception | 006 | Invalid interval format |
| 22 | Data exception | 007 | Invalid datetime format |
| 22 | Data exception | 008 | Datetime field overflow |
| 22 | Data exception | 009 | Invalid time zone displacement value |
| 22 | Data exception | 00B | Escape character conflict |
| 22 | Data exception | 00C | Invalid use of escape character |
| 22 | Data exception | 00D | Invalid escape octet |
| 22 | Data exception | 00E | Null value in array target |
| 22 | Data exception | 00F | Zero-length character string |
| 22 | Data exception | 00G | Most specific type mismatch |
| 22 | Data exception | 00H | Sequence generator limit exceeded |
| 22 | Data exception | 00P | Interval value out of range |
| 22 | Data exception | 00Q | Multiset value overflow |
| 22 | Data exception | 010 | Invalid indicator parameter value |
| 22 | Data exception | 011 | Substring error |
| 22 | Data exception | 012 | Division by zero |
| 22 | Data exception | 013 | Invalid preceding or following size in window function |
| 22 | Data exception | 014 | Invalid argument for NTILE function |
| 22 | Data exception | 015 | Interval field overflow |
| 22 | Data exception | 016 | Invalid argument for NTH_VALUE function |
| 22 | Data exception | 018 | Invalid character value for cast |
| 22 | Data exception | 019 | Invalid escape character |
| 22 | Data exception | 01B | Invalid regular expression |
| 22 | Data exception | 01C | Null row not permitted in table |
| 22 | Data exception | 01E | Invalid argument for natural logarithm |
| 22 | Data exception | 01F | Invalid argument for power function |
| 22 | Data exception | 01G | Invalid argument for width bucket function |
| 22 | Data exception | 01H | Invalid row version |
| 22 | Data exception | 01S | Invalid XQuery regular expression |
| 22 | Data exception | 01T | Invalid XQuery option flag |
| 22 | Data exception | 01U | Attempt to replace a zero-length string |
| 22 | Data exception | 01V | Invalid XQuery replacement string |
| 22 | Data exception | 01W | Invalid row count in fetch first clause |
| 22 | Data exception | 01X | Invalid row count in result offset clause |
| 22 | Data exception | 020 | Invalid period value |
| 22 | Data exception | 021 | Character not in repertoire |
| 22 | Data exception | 022 | Indicator overflow |
| 22 | Data exception | 023 | Invalid parameter value |
| 22 | Data exception | 024 | Unterminated C string |
| 22 | Data exception | 025 | Invalid escape sequence |
| 22 | Data exception | 026 | String data, length mismatch |
| 22 | Data exception | 027 | Trim error |
| 22 | Data exception | 029 | Noncharacter in UCS string |
| 22 | Data exception | 02D | Null value substituted for mutator subject parameter |
| 22 | Data exception | 02E | Array element error |
| 22 | Data exception | 02F | Array data, right truncation |
| 22 | Data exception | 02G | Invalid repeat argument in sample clause |
| 22 | Data exception | 02H | Invalid sample size |
| 23 | Integrity constraint violation | 000 | No subclass |
| 23 | Integrity constraint violation | 001 | Restrict violation |
| 24 | Invalid cursor state | 000 | No subclass |
| 25 | Invalid transaction state | 000 | No subclass |
| 25 | Invalid transaction state | 001 | Active SQL-transaction |
| 25 | Invalid transaction state | 002 | Branch transaction already active |
| 25 | Invalid transaction state | 003 | Inappropriate access mode for branch transaction |
| 25 | Invalid transaction state | 004 | Inappropriate isolation level for branch transaction |
| 25 | Invalid transaction state | 005 | No active SQL-transaction for branch transaction |
| 25 | Invalid transaction state | 006 | Read-only SQL-transaction |
| 25 | Invalid transaction state | 007 | Schema and data statement mixing not supported |
| 25 | Invalid transaction state | 008 | Held cursor requires same isolation level |
| 26 | Invalid SQL statement name | 000 | No subclass |
| 27 | Triggered data change violation | 000 | No subclass |
| 27 | Triggered data change violation | 001 | Modify table modified by data change delta table |
| 28 | Invalid authorization specification | 000 | No subclass |
| 2B | Dependent privilege descriptors still exist | 000 | No subclass |
| 2C | Invalid character set name | 000 | No subclass |
| 2C | Invalid character set name | 001 | Cannot drop SQL-session default character set |
| 2D | Invalid transaction termination | 000 | No subclass |
| 2E | Invalid connection name | 000 | No subclass |
| 2F | SQL routine exception | 000 | No subclass |
| 2F | SQL routine exception | 002 | Modifying SQL-data not permitted |
| 2F | SQL routine exception | 003 | Prohibited SQL-statement attempted |
| 2F | SQL routine exception | 004 | Reading SQL-data not permitted |
| 2F | SQL routine exception | 005 | Function executed no return statement |
| 2H | Invalid collation name | 000 | No subclass |
| 30 | Invalid SQL statement identifier | 000 | No subclass |
| 33 | Invalid SQL descriptor name | 000 | No subclass |
| 34 | Invalid cursor name | 000 | No subclass |
| 35 | Invalid condition number | 000 | No subclass |
| 36 | Cursor sensitivity exception | 000 | No subclass |
| 36 | Cursor sensitivity exception | 001 | request rejected |
| 36 | Cursor sensitivity exception | 002 | request failed |
| 38 | External routine exception | 000 | No subclass |
| 38 | External routine exception | 001 | Containing SQL not permitted |
| 38 | External routine exception | 002 | Modifying SQL-data not permitted |
| 38 | External routine exception | 003 | Prohibited SQL-statement attempted |
| 38 | External routine exception | 004 | Reading SQL-data not permitted |
| 39 | External routine invocation exception | 000 | No subclass |
| 39 | External routine invocation exception | 004 | Null value not allowed |
| 3B | Savepoint exception | 000 | No subclass |
| 3B | Savepoint exception | 001 | Invalid specification |
| 3B | Savepoint exception | 002 | Too many |
| 3C | Ambiguous cursor name | 000 | No subclass |
| 3D | Invalid catalog name | 000 | No subclass |
| 3F | Invalid schema name | 000 | No subclass |
| 40 | Transaction rollback | 000 | No subclass |
| 40 | Transaction rollback | 001 | Serialization failure |
| 40 | Transaction rollback | 002 | Integrity constraint violation |
| 40 | Transaction rollback | 003 | Statement completion unknown |
| 40 | Transaction rollback | 004 | Triggered action exception |
| 42 | Syntax error or access rule violation | 000 | No subclass |
| 44 | With check option violation | 000 | No subclass |
| HZ | Remote database access | 000 | No subclass |
+----+-----------------------------------------------------------+-----+--------------------------------------------------------------+
答案 4 :(得分:0)
您还可以使用getErrorCode()
方法正确处理异常,尤其在使用存储过程或函数时很有用,并且您有自己的自定义错误代码。
对于具有类似背景的人来说可能会有所帮助。
答案 5 :(得分:0)
在catch子句中,您可以更具体地处理Exception
。
try {
// Your code here
} catch(SQLException ex){
if(ex instanceof SQLIntegrityConstraintViolationException) {
// Handle Here
}
}