【问题标题】:Distinguish basic SQLException types in Java?区分 Java 中的基本 SQLException 类型?
【发布时间】:2014-09-13 16:24:00
【问题描述】:

有时命令在某些情况下会失败。

假设我有伪代码

try {
    // insert row
} catch(SQLException ex) {
    // create table
    // insert row
}

我想更具体一点,而不是仅仅抓住一个普通的SQLException。我想区分一下。

  • 表不存在或列数不匹配等正常错误。

  • 更严重的错误,例如超出存储空间或 Java 与 MySQL 之间的通信错误。

我该怎么做?我已经查看了各种选择,例如错误代码或子类,但我不确定要采用哪种方式。

我的目标数据库是 MySQL,但如果有简单的方法,我希望它是跨数据库的。 (比如只捕获比 SQLException 更具体的某个类)

【问题讨论】:

  • 错误代码是要走的路
  • 那个重复假设提问者已经知道错误代码是要走的路,我没有(直到现在),所以我不确定它是否有资格作为重复。
  • @Sanjeev,这就是我想知道的。如果您发布答案,那么我会接受。
  • @GeorgeBailey 添加为答案。

标签: java mysql sql error-handling sqlexception


【解决方案1】:

你可以这样做

catch(SQLException e)
{

    if(e.getMessage().indexOf("ORA-00001")!=-1)
    JOptionPane.showMessageDialog(null,"you have add some 
    information not duplicated ,please click ok and try again...");
}

【讨论】:

    【解决方案2】:

    来自Class SQLException

    Direct Known Subclasses:
        BatchUpdateException, RowSetWarning, SerialException, SQLClientInfoException, SQLNonTransientException, SQLRecoverableException, SQLTransientException, SQLWarning, SyncFactoryException, SyncProviderException 
    

    还有:

    public int getErrorCode()
    
    Retrieves the vendor-specific exception code for this SQLException object.
    
    Returns:
        the vendor's error code
    

    MySQL的错误代码可以在Appendix B Errors, Error Codes, and Common Problems找到

    您应该捕获最具体的异常(适当的子类),然后在需要更多信息时使用getErrorCode()

    【讨论】:

    • 这个答案并没有指导我是否应该使用错误代码或子类。
    • 您可以使用其中一个或两个:) 答案已扩展。
    【解决方案3】:

    在我看来,SQL 错误代码是这种情况下要走的路,因为它们可能会提供 Oracle 文档中提到的实际实现特定的错误代码:

    SQL 错误代码。这是一个整数值,用于标识错误 导致抛出 SQLException 实例。它的价值和意义 是特定于实现的,可能是实际的错误代码 由基础数据源返回。通过调用检索错误 方法 SQLException.getErrorCode。

    例如,如果您使用 Java DB 作为 DBMS 调用方法 CoffeesTable.dropTable,则表 COFFEES 不存在,并且您删除对 JDBCTutorialUtilities.ignoreSQLException 的调用,输出将类似于以下内容:

    SQLState: 42Y55
    Error Code: 30000
    Message: 'DROP TABLE' cannot be performed on
    'TESTDB.COFFEES' because it does not exist.
    

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      这是非常基于意见的,但我认为 SQLException 过于笼统,无法按原样使用。

      我了解大多数访问数据库的程序不会面临处理表不存在的情况的任务,但是有些情况,例如在编写框架或工具时检查表是否存在很重要.对于这些情况,检查所需的列是否也存在并具有正确的类型会更有意义。在这些情况下,访问数据字典是有意义的。当然只有在字典可用的情况下,在某些生产产品上不是这样。

      当数据字典不可用时,唯一的办法是错误消息和错误代码,它们都是特定于供应商的。这意味着没有一种解决方案适合所有人。

      很久以前我写了一个JDBCExceptionHandler,它会接收SQLException,分析它的内容,然后抛出一个更专业的异常,甚至判断异常是否可恢复。最终我转向了 Hibernate,它有一组更全面的异常,而且随着供应商更改了他们的实现,我已经厌倦了维护它。

      但是,如果您确实想继续这一行,那么我的建议是在错误消息上使用错误代码和解析器。子类化将起作用,但仅适用于您自己的一组异常。因此,拥有一个异常处理程序,它将读取代码和消息,然后抛出您自己的一组异常,并按照您认为合适的方式对它们进行子类化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-29
        • 2014-10-03
        • 2012-03-31
        • 1970-01-01
        • 2015-12-16
        • 1970-01-01
        • 1970-01-01
        • 2011-12-31
        相关资源
        最近更新 更多