java - Postgres 异常和 java

标签 java postgresql exception

我正在使用“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/

相关文章:

Android服务绑定(bind)麻烦

java - 有任何注释可以将类标记为测试类吗?

java - 什么是远程方法调用 (RMI)?

sql - Postgres : Add constraint if it doesn't already exist

java - JPA 和 PostgreSQL 网络地址类型

java - 如何关闭 Selenium WebDriver 代码而不在关闭时抛出异常。 java

php - 我将如何使用 PHP 异常来定义重定向?

java - Spring Mongodb 时间戳时区误导

java - 当 HTTP 状态为 202 时,Axis 1.4 不解码 SOAP 信封 - 错误还是功能?

postgresql - 通过 PhpStorm 连接到 PostgreSQL