【问题标题】:PSQLException not getting caughtPSQLException 没有被捕获
【发布时间】:2012-05-31 08:05:51
【问题描述】:

我正在使用 Tomcat 6 和 Postgresql 8.4。我的代码如下所示:

try {
  // Prepared statement inserting something...
} catch (final PSQLException e) {
  LOG.log(Level.SEVERE, "Saving failed.", e);
} catch (final SQLException e) {
  LOG.log(Level.SEVERE, "Saving failed (SQL).", e);
}

此插入 DB 可能会导致 PSQLException(例如唯一键冲突),我想用第一个 catch 捕获它。但是,我在日志中实际发现的是:

SEVERE: Saving failed (SQL).
org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "UZIVATELIA_U_LOGIN"
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
    at cz.ecoremedia.realpad.web.backend.Users.saveNewUser(Users.java:119)
    at cz.ecoremedia.realpad.web.backend.Users.saveUser(Users.java:237)
    at org.apache.jsp.User_jsp._jspService(User_jsp.java:159)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:662)

如果我检查我捕获的e 的类型,例如这样:

} catch (final SQLException e) {
  LOG.log(Level.SEVERE, e.getClass().getName());
  LOG.log(Level.SEVERE, "Saving failed (SQL).", e);

它仍然告诉我它是org.postgresql.util.PSQLException

当我在 Eclipse 中本地尝试此操作时,它运行良好 - PSQLException 在第一个 catch 块中被正确捕获。

如果我正确理解问题,我捕获的 org.postgresql.util.PSQLException 与实际抛出的 org.postgresql.util.PSQLException 是不同的类。这怎么可能?我做错了什么?

感谢您的想法。

【问题讨论】:

  • 你有一个类加载器问题。 postgres 驱动程序在哪里?我猜它不在 /WEB-INF/lib 下的应用程序中。
  • @NathanHughes 你是怎么得出这个结论的? Postgres 设法找出“错误:重复键值违反唯一约束”,如果没有驱动程序,这将是不可能的?
  • @Osama:我没有说司机不在那里。我只是猜想它是在不同的类加载器中加载的。只是猜测。
  • @NathanHughes Classloader 也是我的猜测,但我的WEB-INF/lib 中有一个postgresql-8.4-703.jdbc4.jar。但是,我刚刚在 Tomcat 的 lib/ 文件夹中找到了另一个 JDBC 驱动程序:postgresql-9-1.0-801.jdbc4.jar。可能是这样,我试试删除Tomcat的版本。

标签: java postgresql tomcat sqlexception


【解决方案1】:

事实证明,我的 Tomcat 的 lib/ 文件夹中有另一个 JDBC 驱动程序,除了 WEB-INF/lib/ 中的那个。删除 Tomcat 解决了我的问题。

(是的,这是一个不同的类加载器问题,感谢@NathanHughes。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多