我正在使用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(例如,唯一键冲突),我想用first捕获catch。但是,我实际上在日志中找到的是:
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捕获的类型,例如:
e
} catch (final SQLException e) { LOG.log(Level.SEVERE, e.getClass().getName()); LOG.log(Level.SEVERE, "Saving failed (SQL).", e);
它仍然告诉我那是org.postgresql.util.PSQLException。
org.postgresql.util.PSQLException
当我在Eclipse中本地尝试时,它可以PSQLException正常工作- 在第一个catch块中被正确捕获。
PSQLException
如果我正确理解问题,那么org.postgresql.util.PSQLException我所捕获的类与org.postgresql.util.PSQLException实际抛出的类不同。这怎么可能?我究竟做错了什么?
感谢您的想法。
原来,我的Tomcat lib/文件夹中有另一个JDBC驱动程序,除了中的一个WEB-INF/lib/。删除Tomcat的一个解决了我的问题。
lib/
WEB-INF/lib/
(是的,这是一个不同的类加载器问题,感谢@NathanHughes。)