2010-07-27 82 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