在Java中区分基本的SQLException类型?

时间:2014-07-22 17:49:08

标签: java mysql sql error-handling sqlexception

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

假设我有伪代码

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

我希望更具体而不仅仅是捕捉一般SQLException。我想区分。

  • 表格中的正常错误不存在或列数不匹配。

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

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

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

4 个答案:

答案 0 :(得分:1)

来自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

可以在Appendix B Errors, Error Codes, and Common Problems

找到MySQL的错误代码

您应该捕获最具体的异常(相应的子类),然后在需要其他信息时使用getErrorCode()

答案 1 :(得分:0)

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

据我所知,大多数访问数据库的程序都不会遇到在表不存在时处理案例的任务,但有些情况,例如在检查表是否存在时编写框架或工具时很重要。对于这些情况,检查所需的列是否也存在并且具有正确的类型更有意义。在这些情况下,访问数据字典是有意义的。当然只有字典可用时才会出现,而某些制作产品则不然。

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

很久以前我写了一个JDBCExceptionHandler,它会接收SQLException,分析它的内容并抛出一个更专业的Exception,甚至判断异常是否可以恢复。最后我转向了Hibernate,它有一套更全面的异常,再加上我厌倦了在供应商改变实现时维护它。

但如果您确实想要追求这一行,那么我的建议是在错误消息上使用错误代码和解析器。子类化将起作用,但仅适用于您自己的一组例外。因此,有一个异常处理程序,它将读取代码和消息,然后抛出自己的异常集,并根据需要对它们进行子类化。

答案 2 :(得分:0)

在我看来,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.

希望这有帮助。

答案 3 :(得分:0)

您可以执行以下操作

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...");
}