我正在使用“postgresql-9.3-1102.jdbc3.jar”来连接数据库。 当我有一个异常(exception)时,例如一个空值, 我可以使用多种方法来捕获异常。
例如
尝试 {
......................
}
catch (PSQLException SERS){
…………
}
或者
尝试{.......
}
catch (SQLException se) {.......
}
或者
尝试{
.......
}
catch (异常SE){
........
我的目标是在我感兴趣的情况下捕获特定的 SQLState。
例如我想捕获一个字段的无效 NULL 值, Postgress 返回值“23502”SQLState,但在之前的任何“捕获”中我不能这样做,因为错误代码是继承的我无法检查它。
在之前的“捕获”中,我可以使用“.getmessage”,但这对我没有帮助,我想检查 SqlState
感谢您的任何想法。
最佳答案
捕获 SQLExceptoin
然后使用 SQLException.getSQLState()
并比较它是否是您想要的。
catch (SQLException ex) {
final String ss = ex.getSQLState();
//... blah blah ...
}
参见 PostgreSQL error codes有关 SQLState 的详细信息。 (虽然大多数状态类别和代码在 DB 之间是标准的,但并非所有 DB 都以相同的方式实现它们并同时抛出它们,并且大多数 DB 具有特定于 DB 的额外功能)。
无法根据 SQLState 捕获异常。不幸的是,你必须捕获它,如果它不是你想要的,就把它包起来并重新扔掉。 (不要在没有包装的情况下重新抛出,你会丢失原来的堆栈)。
在 JDBC 4 中,有 SQLException
的子类,例如 SQLNonTransientException
,您可以捕获它们,但前提是 JDBC 驱动程序抛出这些子类。在撰写本文时,PgJDBC 不支持这些,并且总是简单地抛出 SQLException
,因此如果您 try catch 它们,您将永远捕获不到任何东西。 (欢迎打补丁!)。
在现实世界中,您通常对许多不同的错误条件感兴趣,并希望根据它们做不同的事情。
有点像未经测试的、写在窗口中的内容:
} 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);
}
}
...如果您的应用程序知道在看到空连接时重新连接,并记录它刚刚尝试的事务,以便它可以在循环中重试,直到它遇到死锁或序列化失败时成功。
实际上你会比这更聪明,添加重试速率限制等。这只是一个简单的例子。
有关更多详细信息,请将异常转换为 PSQLException
在测试可转换性之后,或者首先将其作为 PSQLException
捕获。然后获取详细信息:
ex.getServerErrorMessage()
它给你一个 ServerErrorMessage
具有详细的字段。
关于java - Postgres 异常和 java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26383624/