有时在某些情况下命令会失败。
假设我有伪代码
try {
// insert row
} catch(SQLException ex) {
// create table
// insert row
}
我希望更具体而不仅仅是捕捉一般SQLException
。我想区分。
和
我该怎么做?我已经查看了各种选项,例如错误代码或子类,但我不确定采用哪种方式。
我的目标数据库是MySQL,但如果有一个简单的方法,我希望这是跨数据库。 (比如只捕获某个比SQLException更具体的类)
答案 0 :(得分:1)
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...");
}