代码之家  ›  专栏  ›  技术社区  ›  Jeff Ferland

异常捕获太早

  •  0
  • Jeff Ferland  · 技术社区  · 14 年前

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

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

    我的断点设置在抛出行(并成功触发),但println语句从不生成输出(MySQL使用的是某种记录器设置,我找不到一个打开的文件)。找到异常捕获位置有什么窍门吗?

    编辑1:

    我打电话来

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

    java.sql.DriverManager 班级和我的 HibernateUtil

    编辑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 回复  |  直到 14 年前
        1
  •  1
  •   Péter Török    14 年前

    首先,当你提到有一个记录器时,你应该替换所有的 println 包含日志调用的语句。

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

        2
  •  1
  •   Jeff Ferland    14 年前

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

    Netbeans,在我给它Hibernate的源代码之后,出于一些恼人的原因,仍然想调用所有这些“隐藏的源代码调用”。

        3
  •  0
  •   Thorbjørn Ravn Andersen    14 年前