Использовать две попытки поймать? - PullRequest
2 голосов
/ 18 января 2012

Какая польза от двух попыток, как показано ниже?Взято из книги «Начало гибернации».

protected void rollback() {
        try {
            getSession().getTransaction().rollback();
        } catch (HibernateException e) {
            // TODO change to log
            System.out.println(e);
        }

        try {
            getSession().close();
        } catch (HibernateException e) {
            // TODO change to log
            System.out.println(e);
        }
    }

Ответы [ 4 ]

4 голосов
/ 18 января 2012

Это гарантирует, что close() будет вызвано, даже если rollback() выдает исключение.

2 голосов
/ 18 января 2012

Первоначальной целью было закрыть сеанс, даже если метод rollback () выдает исключение, но это решение недостаточно хорошо.

Если roolback создает исключение RuntimeException, код закрытия никогда не будет вызываться

Вы должны сделать следующее:

protected void rollback() {
        try {
            getSession().getTransaction().rollback();
        } catch (HibernateException e) {
            // TODO change to log
            System.out.println(e);
        } finally {
            try {
                getSession().close();
            } catch (HibernateException e) {
                // TODO change to log
                System.out.println(e);
            }
        }
    }

Это гарантирует, что код закрытия будет вызываться независимо от того, что.

0 голосов
/ 18 января 2012

Причина в независимости между этими частями. Обе части могут выйти из строя независимо. (И обрабатывается также самостоятельно). Сбой вызова 'rollback' не помешает выполнению оператора 'close', в отличие от подхода с использованием одного блока try-catch для этого случая.

0 голосов
/ 18 января 2012

Нет, правда. Если вы замените этот код на

protected void rollback() {
        try {
            getSession().getTransaction().rollback();
            getSession().close();
        } catch (HibernateException e) {
            // TODO change to log
            System.out.println(e);
        }
    }

вы по-прежнему получаете почти такую ​​же информацию. Есть небольшие отличия:

в первом случае строка getSession().close(); будет по-прежнему вызываться, даже если getSession().getTransaction().rollback(); выдает исключение, а в моем примере это не так. Однако правильный способ справиться с этим - использовать блок finally, если вы хотите, чтобы эта строка .close () вызывалась независимо от того, что.

...