我正在使用“postgresql-9.3-1102.jdbc3.jar”来连接数据库。 当我有一个例外,例如一个空值, 我可以使用几种方法来捕获异常。
e.g。
尝试{
............
}
catch(PSQLException seRs){
.........
}
或者
尝试{.......
}
catch(SQLException se){.......
}
或者
尝试{
.......
}
catch(Exception se){
........
}
我的目标是在我感兴趣的情况下捕获特定的SQLState。
例如,我想捕获一个字段的无效NULL值, Postgress返回值“23502”SQLState但是在任何先前的“捕获”中我都无法做到,因为错误代码是继承的我无法检查它。
在之前的“捕获”中,我可以拥有“.getmessage”,但这并没有帮助我,我想检查SqlState
感谢任何想法。
答案 0 :(得分:6)
抓住SQLExceptoin
然后使用SQLException.getSQLState()
并对其进行比较,看看它是否符合您的要求。
catch (SQLException ex) {
final String ss = ex.getSQLState();
//... blah blah ...
}
有关SQLState的详细信息,请参阅PostgreSQL error codes。 (虽然大多数状态类别和代码都是DB的标准,但并非所有DB都以相同的方式实现它们并且同时抛出它们,并且大多数DB都具有DB特定的附加功能。)
无法根据SQLState捕获异常。不幸的是,你必须抓住它,如果它不是你想要包装并重新扔它。 (不要在没有包装的情况下重新抛出,你会丢失原始筹码)。
在JDBC 4中,您可以捕获SQLException
类似SQLNonTransientException
的子类,但前提是JDBC驱动程序会抛出这些子类。在写作时,PgJDBC不支持这些,并且总是简单地抛出SQLException
,所以如果你试图抓住它们,你将永远不会抓到任何东西。 (欢迎补丁!)。
在现实世界中,您通常会对许多不同的错误条件感兴趣,并希望根据它们做不同的事情。
模仿未经测试的,写在窗口的东西:
} catch (SQLException ex) {
final String ss = ex.getSQLState();
if (ss.equals("40001") || ss.equals("40P01")) {
/* It is a serialization failure or a deadlock abort. Retry the tx. */
retry_transaction = true;
} else if (ss.startsWith("08") || ss.startsWith("53")) {
/* It is a connection error or resource limit. Reconnect and retry. */
try {
conn.close();
} catch (SQLException ex) {
logger.log("Error closing suspected bad connection after SQLState " + ss, ex);
}
conn = null; /* App knows to reconnect if it sees a null connection */
retry_transaction = true;
} else {
throw new MyAppException(ex);
}
}
...如果应用程序看到空连接,则知道重新连接,并保留刚刚尝试的事务记录,以便它可以在循环中重试它,直到它遇到死锁或序列化失败成功为止。 / p>
实际上,你比这更聪明,增加重试的速率限制等。这只是一个简单的例子。
有关详细信息,请在测试可投射性后将异常强制转换为PSQLException
,或者首先将其作为PSQLException
捕获。然后获取详细信息:
ex.getServerErrorMessage()
为您提供包含详细字段的ServerErrorMessage
。
答案 1 :(得分:0)
使用连接获取sql状态
DatabaseMetaData dmd = connection.getMetaData();
int type = dmd.getSQLStateType();
http://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html#getMetaData%28%29 http://docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData.html#sqlStateSQL
完整示例:
Connection conn = null;
try
{
String url = "jdbc:postgresql://localhost/yourdb?user=test&password=secret";
conn = DriverManager.getConnection(url);
// Some sql query or stuff
}
catch (Exception e)
{
if (conn != null)
{
DatabaseMetaData dmd = conn.getMetaData();
int type = dmd.getSQLStateType();
// Do something with this state
}
}