如何在JDBC中发现特定的例外情况?例子:主键异常或外键异常。如何捕获JDBC中的特定异常?
回答
SQLException包含与例外中的某些特定数据库的信息。从DOC:
每个SQLException提供了几种 种信息:
1)一个串 描述错误。这用作 Java异常消息,可通过方法getMesage获得 。
2)“SQLState” 字符串,它遵循XOPEN SQLState约定或SQL 99 约定。在 适当的规范中描述了 SQLState字符串的值。 DatabaseMetaData的 方法getSQLStateType可用于 发现驾驶员是否返回 的XOPEN类型或SQL 99类型。
3)an 整数错误代码,特定于每个供应商的 。通常这将是由 基础数据库返回的 实际错误代码。
4)一个链到下一个 异常。这可以用来提供 附加的错误信息。
Brian的权利,SQLException将抛出几乎任何JDBC问题。这部分是为什么JDBC如此令人讨厌。 Spring library JDBC helpers提供exception translator来查看SQLCode,SQLState等,并抛出相应的DataAccessException。这些异常类有很多,它们可以让您更好地了解哪里出了问题,并提供诸如DataIntegrityViolationException,DataSourceLookupFailureException,PermissionDeniedDataAccessException等名称。
更具体地处理SQLException
的最佳和独立于数据库的方式是确定可通过SQLException#getSQLState()
获得的SQL状态代码。 SQLState是一个5个字符的代码,其中前两个代码在所有数据库中都很常见,而最后三个代码可能因数据库和/或特定条件而异。下面是来自spec的摘录:
- 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");
}
我可以从我的异常中获取详细消息,通知我的新行违反了某些约束,但是当我执行“e。getSQLState()'为了定制我的消息我总是得到一个'null'值。有什么办法可以解决这个问题吗? – Pere 2017-02-27 11:55:09
以下是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 |
+----+-----------------------------------------------------------+-----+--------------------------------------------------------------+
您还可以使用getErrorCode()
方法要正确处理异常,尤其是有用的,当你使用存储过程或函数工作,你有自己的自定义错误代码。
对于具有相似背景的人可能会有帮助。
在catch子句中,您可以更具体地处理该Exception
。
try {
// Your code here
} catch(SQLException ex){
if(ex instanceof SQLIntegrityConstraintViolationException) {
// Handle Here
}
}
通常最好使用额外的特定catch子句,而不是使用if。 – 2018-02-24 11:42:41
当然我加了糖,你加完了加入茶!但我更喜欢这种方式,因为在进入'if'之前我通常会使用一般的异常,对我来说它更易于维护,但是选择总是依赖于开发人员。 – 2018-02-24 14:38:39
- 1. 使用Jdbc捕获特定的FK异常
- 2. 通过从特定捕获到特定捕获的异常
- 3. 捕获PHP异常的特定实例
- 4. 如何在异常中捕获异常?
- 5. Java何时捕获一般异常和特定异常
- 6. 捕捉特定的异常
- 7. 如何在发送邮件时捕获特定的异常?
- 8. 如何捕获我期望的特定异常?
- 9. 如何捕捉“未捕获的异常”?
- 10. 如何捕获substr异常?
- 11. 如何捕获此异常
- 12. 如何捕获UrlFetchApp.fetch异常
- 13. 如何捕获Interop异常?
- 14. 如何捕获jquery异常?
- 15. 如何捕获特定异常实例而不是特定异常类的任何实例?
- 16. 捕获异常
- 17. 异常捕获
- 18. 捕获异常
- 19. 捕获异常
- 20. 的Python:捕捉特定的异常
- 21. 只在RxJava中捕获特定类型的异常2
- 22. 如何从Spring $$ EnhancerBySpringCGLIB $$中捕获异常?
- 23. 如何在实体中捕获异常?
- 24. 如何从gsoap中捕获异常?
- 25. 如何在iOS中捕获异常?
- 26. 如何从ReactiveCommand中捕获异常?
- 27. 如何在FutureTask中捕获异常
- 28. 如何从CloseHandle()中捕获异常
- 29. 如何在Eclipse中忽略特定类型的未捕获异常?
- 30. 在Clojure中捕获自定义异常
^伟大的资源列表^。 Spring已经提供了太多的内容,我希望我有时间回顾每一个API。无论如何,我也想扔掉那里,这听起来像是这个问题被潜意识指向一个INSERT,PK或FK是相同的,因此不能插入。如果是这种情况,您可以捕获DataIntegrityViolationException,但更合适的句柄是使用SQL MERGE子句而不是INSERT。 请参阅http://en.wikipedia.org/wiki/Merge_(SQL) – Prancer 2014-11-14 12:35:20