2010-07-27 3 views
0

Фон: Hibernate подключается к базе данных, используя имя пользователя и пароль, введенные в графический интерфейс. При сбое вместо распространения ошибки в качестве исключения она выводится как трассировка стека в регистраторе. Я не знаю, где это исключение. Кроме того, чуть-чуть утруждая является следующий блок:Исключение Caught Too Early

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

Моя точка останова устанавливается на броска (и успешно запускает), но Println заявление никогда не генерирует вывод (MySQL использует какой-то настройки регистратора я могу» t найти файл открытого файла). Какой-то трюк для определения места исключения?

EDIT 1:

Я называю

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

Исключение перехватывается Hibernate где-то между java.sql.DriverManager класса и моего HibernateUtil класса. Я полагаю, мы можем обвинить Hibernate, решив, что я действительно не хочу видеть исключение. Я хочу убедить спящий режим, чтобы я мог видеть исключение.

EDIT 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

Где вы смотрите на выход? –

+0

«Я не знаю, где это исключение поймано» - ну, а где вы звоните в Hibernate? –

+0

@matt b: см. Обновленное редактирование в течение следующих нескольких минут @Alberto Zaccagni: консоль NetBeans (в любое другое время я использовал оператор печати, он идет туда). –

ответ

1

Вот результат: Линия 116 из org.hibernate.cfg.SettingsFactory улавливает исключение sql и заставляет его записывать журнал. Для его изменения нет конфигурации. Похоже, я не смогу рассказать конечному пользователю, почему их соединение завершается неудачно, если я не использую журналы.

Netbeans, по какой-то досадной причине после того, как я дал ему источник для Hibernate, все еще хотел назвать все эти «скрытые вызовы источника». Некоторое время с VIM и читая номера строк позже, я выяснил это.

0

Установите точку останова для созданного исключения и когда отладчик начнет один шаг, чтобы узнать, что произойдет. Вероятно, вам понадобится всего несколько шагов, прежде чем произойдет печать.

+0

Отрицательный. Я уже установил точку отладки и ушел. Поскольку у меня нет источника Hibernate, после исключения я получаю 5 запросов на резервное копирование стека и никогда не узнаю нужную мне информацию. Я могу заставить его ответить на мой вопрос, но я действительно хочу решить это, не глядя на источник внешней библиотеки и, конечно же, без изменения библиотеки. –

+0

Eclipse Может проходить через код без источника. Какой отладчик вы используете? –

1

Прежде всего, поскольку вы упоминаете, что есть регистратор, вы должны заменить все операторы println с помощью вызовов журнала.

Вы также можете добавить дополнительные сообщения журнала, чтобы определить, что происходит внутри приложения. В качестве альтернативы (или в сочетании с вышесказанным) вы можете пройти через часть критического кода в отладчике, чтобы увидеть, где действительно происходит исключение.

+0

Обычно да, но это не мой исходный код, который использует println. Тот, о котором я упоминаю в моем вопросе, принадлежит java.sql.DriverManager - часть JDK. Я думаю, я должен оставаться вне этого. Я знаю, где происходит исключение, я не знаю, где на трассе копировать стек, который он поймал. Все это происходит во внешней библиотеке Hibernate. Хотя я могу получить исходный код для этого, я склоняюсь к мысли, что я задал неправильный вопрос. –

Смежные вопросы