2010-01-01 206 views

回答

7

SQLException包含与例外中的某些特定数据库的信息。从DOC:

每个SQLException提供了几种 种信息:

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

2)“SQLState” 字符串,它遵循XOPEN SQLState约定或SQL 99 约定。在 适当的规范中描述了 SQLState字符串的值。 DatabaseMetaData的 方法getSQLStateType可用于 发现驾驶员是否返回 的XOPEN类型或SQL 99类型。

3)an 整数错误代码,特定于每个供应商的 。通常这将是由 基础数据库返回的 实际错误代码。

4)一个链到下一个 异常。这可以用来提供 附加的错误信息。

4

Brian的权利,SQLException将抛出几乎任何JDBC问题。这部分是为什么JDBC如此令人讨厌。 Spring library JDBC helpers提供exception translator来查看SQLCode,SQLState等,并抛出相应的DataAccessException。这些异常类有很多,它们可以让您更好地了解哪里出了问题,并提供诸如DataIntegrityViolationException,DataSourceLookupFailureException,PermissionDeniedDataAccessException等名称。

+0

^伟大的资源列表^。 Spring已经提供了太多的内容,我希望我有时间回顾每一个API。无论如何,我也想扔掉那里,这听起来像是这个问题被潜意识指向一个INSERT,PK或FK是相同的,因此不能插入。如果是这种情况,您可以捕获DataIntegrityViolationException,但更合适的句柄是使用SQL MERGE子句而不是INSERT。 请参阅http://en.wikipedia.org/wiki/Merge_(SQL) – Prancer 2014-11-14 12:35:20

24

更具体地处理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"); 
} 
+0

我可以从我的异常中获取详细消息,通知我的新行违反了某些约束,但是当我执行“e。getSQLState()'为了定制我的消息我总是得到一个'null'值。有什么办法可以解决这个问题吗? – Pere 2017-02-27 11:55:09

2

以下是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             | 
+----+-----------------------------------------------------------+-----+--------------------------------------------------------------+ 
0

您还可以使用getErrorCode()方法要正确处理异常,尤其是有用的,当你使用存储过程或函数工作,你有自己的自定义错误代码。

对于具有相似背景的人可能会有帮助。

0

在catch子句中,您可以更具体地处理该Exception

try { 

// Your code here 

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

通常最好使用额外的特定catch子句,而不是使用if。 – 2018-02-24 11:42:41

+0

当然我加了糖,你加完了加入茶!但我更喜欢这种方式,因为在进入'if'之前我通常会使用一般的异常,对我来说它更易于维护,但是选择总是依赖于开发人员。 – 2018-02-24 14:38:39