2012-05-24 117 views
3

我正在使用Tomcat 6和Postgresql 8.4。我的代碼如下:PSQLException沒有被捕獲

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); 
} 

該插入到數據庫可能會導致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不同的類,它實際上被拋出。這怎麼可能?我究竟做錯了什麼?

感謝您的想法。

+1

您有類加載器問題。 postgres驅動程序在哪裏?我猜測它不在/ WEB-INF/lib下的應用程序中。 –

+0

@NathanHughes你是如何得出這個結論的? Postgres設法弄清楚'錯誤:重複鍵值違反了唯一約束'',這在沒有驅動程序的情況下是不可能的? –

+2

@Osama:我沒有說驅動程序不在那裏,我只是猜測它裝載在不同的地方classloader只是一個猜測 –

回答

1

原來,我的Tomcat的lib/文件夾中有另一個JDBC驅動程序,除了WEB-INF/lib/中的一個之外。刪除Tomcat的一個解決了我的問題。

(是的,這是一個不同的類加載器問題,感謝@NathanHughes。)