Попробуйте-поймать-наконец, а затем снова попробовать поймать

button('hey') вызывает функцию, а не устанавливает ее как обратный вызов.

30
задан Ajay 12 January 2010 в 10:39
поделиться

7 ответов

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

Вы закончите напишите что-нибудь вроде этого:

public class SQLUtils 
{
  private static Log log = LogFactory.getLog(SQLUtils.class);

  public static void closeQuietly(Connection connection)
  {
    try
    {
      if (connection != null)
      {
        connection.close();
      }
    }
    catch (SQLExcetpion e)
    {
      log.error("An error occurred closing connection.", e);
    }
  }

  public static void closeQuietly(Statement statement)
  {
    try
    {
      if (statement!= null)
      {
        statement.close();
      }
    }
    catch (SQLExcetpion e)
    {
      log.error("An error occurred closing statement.", e);
    }
  }

  public static void closeQuietly(ResultSet resultSet)
  {
    try
    {
      if (resultSet!= null)
      {
        resultSet.close();
      }
    }
    catch (SQLExcetpion e)
    {
      log.error("An error occurred closing result set.", e);
    }
  }
}

И ваш клиентский код будет примерно таким:

Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try 
{
  connection = getConnection();
  statement = connection.prepareStatement(...);
  resultSet = statement.executeQuery();

  ...
}
finally
{
  SQLUtils.closeQuietly(resultSet);
  SQLUtils.closeQuietly(statment);
  SQLUtils.closeQuietly(connection);
}

Обновление: начиная с Java 7, различные интерфейсы JDBC расширяют java.lang.AutoCloseable и в то время как приведенный выше код отвечает на исходный вопрос. Если вы пишете код непосредственно для JDBC API, теперь его можно структурировать:

try (
  Connection connection = getConnection();
  PreparedStatement statement = connection.prepareStatement(...);
  ResultSet resultSet = statement.executeQuery()
)
{
  ...
}
26
ответ дан 27 November 2019 в 22:19
поделиться

Обычно вы не хотите делать ничего, кроме регистрации исключения, которое происходит при закрытии ресурса, поэтому оно действительно должно идти в собственном try / catch. Однако это общий код, который будет часто повторяться, поэтому не повторяйте себя и закрывайте статический метод (как предлагает Ник Холт), чтобы у вас не было двух элементов try / catch в одном методе, упрощение чтения и понимания кода.

0
ответ дан 27 November 2019 в 22:19
поделиться

Как уже упоминалось, статическая closeQuietly утилита - это лучший вариант. Стоит добавить, что если вы находитесь в мире java.io , а не java.sql , то есть полезный интерфейс именно для этой цели - java.io. Closeable

Все источники и приемники данных в java.io реализуют этот интерфейс - все потоки, каналы, средства записи и чтения. Таким образом, вы можете создать единую утилиту, которая справится с той же проблемой «исключение при close ()», не требуя множества перегруженных версий.

например,

public class IoUtils {

  public static closeQuietly (Closeable closeable) {
    try {
      closeable.close();
    } catch (IOException logAndContinue) {
      ...
    }
  }

}
12
ответ дан 27 November 2019 в 22:19
поделиться

Commons-io также имеет closeQuietly () для входящего и выходного потоков. Я постоянно им пользуюсь. Это делает ваш код более читабельным.

4
ответ дан 27 November 2019 в 22:19
поделиться

Не сомневайтесь, сделайте еще одну попытку ... наконец-то поймайте внутрь.

1
ответ дан 27 November 2019 в 22:19
поделиться

просто помните ... наконец, всегда запускайте выполнение с помощью try или catch ..

-1
ответ дан 27 November 2019 в 22:19
поделиться

Я обычно делал это следующим образом:

try {
    try {
        ..
        stmts
        ...
    }
    finally {
       connection.close():
    }
} catch (Exception ex) {
     ..
     stmts
     ..    
}

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

Как указывает Imagist , технически это не то же самое, что finally будет выполняться до перехвата, но я думаю, что это решает проблему, которую вы пытались решить.

10
ответ дан 27 November 2019 в 22:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: