2010-07-27 78 views
0

背景:Hibernate使用輸入到GUI中的用戶名和密碼連接到數據庫。在失敗時,不是將錯誤作爲異常傳播,而是作爲記錄器中的堆棧跟蹤出現。我不知道這個例外在哪裏。也一點點麻煩的是以下塊:異常過早提早

if (reason != null) { 
    println("getConnection failed: " + reason); 
    throw reason; 
} 

我的斷點設置在罰球線(併成功觸發),但println語句,也永遠不會生成輸出(MySQL是使用某種記錄儀安裝的,我可以」找到一個開放的文件)。尋找異常被捕獲的任何技巧?

編輯1:

我打電話

sessionFactory = /*AnnotationConfiguration*/ ac.buildSessionFactory(); 

例外的是Hibernate某處java.sql.DriverManager類和我HibernateUtil類的夾縫。我認爲我們可以責怪Hibernate決定我不想看到異常。我想說服hibernate讓我看到異常。

編輯2:

我的堆棧是這樣的:

java.sql.SQLException: Access denied for user 'user'@'machine' (using password: YES) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:910) 
    at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3923) 
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1273) 
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2031) 
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:718) 
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) 
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302) 
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282) 
/* Exception is thrown on the next line (1st code block in original post). */ 
    at java.sql.DriverManager.getConnection(DriverManager.java:582) 
    at java.sql.DriverManager.getConnection(DriverManager.java:154) 
/* Begin hidden source calls */ 
    at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:110) 
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:84) 
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292) 
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859) 
/* End hidden source calls */ 
    at com.****.****.util.HibernateUtil.initialize(HibernateUtil.java:34) 

我不能讓調試器來看看超越DriverManager.java:582棧之上的任何一點。除此之外的所有內容在調試器中都不可見。

+0

你在哪裏尋找輸出? – 2010-07-27 15:40:07

+0

「我不知道異常處在什麼位置」 - 好吧,你在哪裏調用Hibernate? – 2010-07-27 15:45:21

+0

@matt b:在接下來的幾分鐘內看到更新後的編輯 @Alberto Zaccagni:NetBeans的控制檯(其他任何時候我使用過打印語句,它會到那裏)。 – 2010-07-27 15:56:41

回答

1

下面是最終結果:org.hibernate.cfg.SettingsFactory的第116行捕獲sql異常並強制它記錄日誌。沒有配置可用於更改此設置。看來我不能告訴我的最終用戶爲什麼他們的連接失敗,除非我使用日誌。

Netbeans,因爲一些令人討厭的原因,我給它的Hibernate的源代碼仍然想調用所有這些「隱藏的源調用」。有一段時間,VIM和稍後閱讀行號,我已清除它。

0

爲拋出的異常設置一個斷點,以及調試器開始單步看看會發生什麼。在印刷發生之前,您可能只需要幾個步驟。

+0

否定的。我已經設置了調試點並下臺。由於我沒有Hibernate源代碼,所以在發生異常之後,我會拋出5個調用備份堆棧,並且永遠不會查找我需要的信息。我可能會得到它來回答我的問題,但我真的想要解決這個問題,而無需查看外部庫的來源,當然也不需要修改庫。 – 2010-07-27 17:16:06

+0

Eclipse可以在沒有源代碼的情況下遍歷代碼。你使用哪種調試器? – 2010-07-27 17:35:03

1

首先,如您所說有一個記錄器,您應該用日誌調用替換所有println語句。

您還可以添加進一步的日誌消息,以確定應用程序內發生了什麼。或者(或與上述結合),您可以遍歷調試器中的關鍵代碼部分,以查看實際發生異常的位置。

+0

通常是的,但它不是我使用println的源代碼。我在我的問題中提到的一個來自java.sql.DriverManager - JDK的一部分。我想我應該留在那之外。我知道異常發生在哪裏,我不知道在哪裏追蹤它捕獲的堆棧。這一切都發生在外部Hibernate庫中。雖然我可以得到它的源代碼,但我傾向於認爲我提出了錯誤的問題。 – 2010-07-27 17:14:47