异常过早

时间:2010-07-27 15:37:37

标签: java hibernate exception-handling

背景: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之外的堆栈上方的任何位置。在调试器中看不到堆栈中的所有内容。

3 个答案:

答案 0 :(得分:1)

首先,正如您提到的有一个记录器,您应该用日志调用替换所有println语句。

您还可以添加更多日志消息,以确定应用内发生的情况。或者(或与上面结合使用),您可以逐步调试调试器中的关键代码部分,以查看异常实际发生的位置。

答案 1 :(得分:1)

这是最终结果:org.hibernate.cfg.SettingsFactory的第116行捕获sql异常并强制它到日志。没有可用于更改此配置的配置。看来我将无法告诉我的最终用户为什么他们的连接失败,除非我使用日志。

Netbeans,在我给它Hibernate的源代码之后,由于一些恼人的原因,仍然希望调用所有这些“隐藏的源代码调用”。有一段时间使用VIM并稍后读取行号,我已经清理了它。

答案 2 :(得分:0)

为抛出的异常设置断点,并在调试器启动单步时查看发生的情况。在打印发生之前,您可能只需要几个步骤。