Когда выбрасывается «исключение бросков»?

1

Предположим, что следующая функция:

public void close() throws SQLException {
    if (rs != null) { rs.close(); }
    if (ps != null) { ps.close(); }
    if (connection != null){ connection.close(); }
}

Если я попытаюсь закрыть rs, и он терпит неудачу, остальная часть моего кода все равно будет выполнена (т.е. Исключение будет выбрано в конце), или оно немедленно прерывает функцию (и, таким образом, предотвращает правильное закрытие ps и соединения),

  • 1
    любое исключение немедленно остановит программу :)
  • 1
    Кстати, исключение ничем не «вызывается», оно выбрасывается. Это означает, что исключение прерывает нормальный программный поток для перехода в исключительное состояние, которое необходимо «перехватить» и обработать. Также посмотрите на предложение finally .
Показать ещё 2 комментария
Теги:
exception-handling

5 ответов

5
Лучший ответ

Если исключение происходит в rs.close, то исключение rs.close. Если вы хотите, чтобы эти другие операторы выполнялись, вам нужно finally использовать. Если вы подозреваете, что будет closeQuietly другое исключение, вы можете создать такую функцию, как closeQuietly которая будет признавать, но отказаться от исключений, если вы считаете, что их можно безопасно игнорировать. Например (из этого ответа),

protected void closeQuietly( Resource resource ) {
      try {
        if (resource != null) {
          resource.close();
        }
      } catch( Exception ex ) {
        log( "Exception during Resource.close()", ex );
      }
    }
  • 0
    Таким образом, мне нужно вложить каждый оператор close в блок finally из предыдущего?
  • 0
    @Andreas: Проверьте ответ, который я связал. Это хороший пример.
2

Когда rs.close() выдает исключение, остальные строки не будут выполнены. Пойманное исключение будет распространяться.

Если вы хотите, чтобы другой оператор не прерывал работу с другими, используйте отдельный блок try/catch для каждого закрытия.

Вы можете создать метод утилиты для закрытия ресурсов, а затем вызвать этот метод с помощью ресурсов. Поскольку AutoCloseable является супер интерфейсом Connection, Statement, ResultSet, вы можете определить метод утилиты, как AutoCloseable ниже

public static void closeQuietly(AutoCloseable resource ) {
      try {
        if (resource != null) {
          resource.close();
        }
      } catch( Exception ex ) {
        log( "Exception during closing the resources", ex );
      }
    }
1

Это то, на что предназначена новая функция Java 7 try-with-resources !

Вы просто используете его таким образом:

try (
    final Type1 rs = ...;
    final Type2 ps = ...;
    final Connection connection = ...
) {
    ...
    ... // usefull code here
    ...
}
catch (...) {
    // exception handling
}

и автоматически все закрывается в любом случае (если ваш полезный код генерирует исключение или если он не бросается), все исключения обрабатываются, и вы оставляете блок в согласованном состоянии. Единственное, что все классы (Type1, Type2, Connection) должны реализовывать интерфейс Autocloseable.

1

вам нужно поместить строки, которые вы хотите выполнить в последнем объявлении, оператор finally сделает то, что вы хотите, прежде чем выбросить исключение. Вы также можете проверить autocloseable интерфейс

1

Если первая команда вызывает исключение, остальная часть программы больше не выполняется. Чтобы решить эту проблему, finally -block был введен для обработки исключений. Там вы можете освободить любые ресурсы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню