首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异常捕获得太早

异常捕获得太早
EN

Stack Overflow用户
提问于 2010-07-27 15:37:36
回答 3查看 220关注 0票数 0

背景: Hibernate使用输入到GUI中的用户名和密码连接到数据库。失败时,它不是将错误作为异常传播,而是在记录器中作为堆栈跟踪出现。我不知道这个例外是在哪里被发现的。还有一个小问题是下面的块:

代码语言:javascript
复制
if (reason != null)    {
    println("getConnection failed: " + reason);
    throw reason;
}

我的断点设置在抛出行(并成功触发),但println语句从未生成输出(MySQL正在使用某种类型的记录器设置,我无法找到打开的文件手)。任何一种定位异常位置的技巧?

编辑1:

我打电话

代码语言:javascript
复制
sessionFactory = /*AnnotationConfiguration*/ ac.buildSessionFactory();

这个异常被Hibernate捕获,位于java.sql.DriverManager类和我的HibernateUtil类之间。我想我们可以怪Hibernate,因为我不想看到异常。我想说服hibernate让我看到异常。

编辑2:

我的堆栈是:

代码语言:javascript
复制
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之外堆栈上的任何点。在调试器中看不到堆栈之外的所有内容。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-28 15:14:17

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

Netbeans,由于一些恼人的原因,在我给它之后,Hibernate的源代码仍然想调用所有这些“隐藏的源调用”。过了一段时间,我又读了几行号码,我把它弄清楚了。

票数 1
EN

Stack Overflow用户

发布于 2010-07-27 16:01:22

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

您还可以添加更多的日志消息,以确定应用程序内部发生了什么。或者(或者结合上面的内容),您可以在调试器中逐步遍历关键代码部分,查看异常实际发生的位置。

票数 1
EN

Stack Overflow用户

发布于 2010-07-27 15:57:42

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3345319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档