繁体   English   中英

异常捕获得太早

[英]Exception Caught Too Early

背景:Hibernate使用在GUI中输入的用户名和密码连接到数据库。 发生故障时,它不会将错误传播为异常,而会在记录器中以堆栈跟踪的形式出现。 我不知道在哪里发现异常。 还有一点麻烦的是以下块:

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

我的断点设置在抛出行(并成功触发),但是println语句从不生成输出(MySQL使用某种记录程序设置,我找不到打开的文件)。 找到异常捕获位置的任何技巧?

编辑1:

我打电话

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

Hibernate在java.sql.DriverManager类和我的HibernateUtil类之间的某个地方捕获到异常。 我想我们可以责怪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,我无法让调试器查看堆栈上方的任何点。 堆栈中超出此范围的所有内容在调试器中都不可见。

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

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

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

Netbeans,出于某些令人讨厌的原因,在我给它提供Hibernate的源代码后,仍然希望将所有这些称为“隐藏的源代码调用”。 使用VIM一段时间后再读取行号,我已经弄清了。

为引发的异常设置一个断点,并在调试器启动一个步骤时查看发生了什么。 您可能只需要执行几个步骤,即可进行打印。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM