Postgres Exceptions和java

Eli*_*ias 2 java postgresql exception-handling exception

我正在使用"postgresql-9.3-1102.jdbc3.jar"来连接数据库.当我有一个例外,例如一个空值时,我可以使用几种方法来捕获异常.

例如try { ............} catch(PSQLException seRs){ ......... }

要么

try { .......} catch(SQLException se){ .......}

要么

try { .......} catch(Exception se){ ........ }

我的目标是在我感兴趣的情况下捕获特定的SQLState.

例如,我想捕获一个字段的无效NULL值,Postgress返回值"23502"SQLState但在任何先前的"捕获"我不能这样做,因为错误代码是继承的我无法检查它.

在之前的"捕获"中,我可以拥有".getmessage",但这并不能帮助我,我想检查SqlState

谢谢你的任何想法.

Cra*_*ger 7

捕获SQLExceptoin然后使用SQLException.getSQLState()并比较它,看看它是否是你想要的.

catch (SQLException ex) {
   final String ss = ex.getSQLState();
   //... blah blah ...
}
Run Code Online (Sandbox Code Playgroud)

有关SQLState详细信息,请参阅PostgreSQL错误代码.(虽然大多数状态类别和代码是跨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);
  }
}
Run Code Online (Sandbox Code Playgroud)

...如果应用程序看到空连接,则知道重新连接,并保留刚刚尝试的事务记录,以便它可以在循环中重试它,直到它遇到死锁或序列化失败成功.

实际上,你比这更聪明,增加重试的速率限制等.这只是一个简单的例子.


有关更多详细信息,请PSQLException在测试可投射性之后将异常强制转换为或者PSQLException首先将其捕获为.然后获取详细信息:

ex.getServerErrorMessage()
Run Code Online (Sandbox Code Playgroud)

它为您提供ServerErrorMessage了详细的字段.