Java try-finally внутри шаблона try-catch - PullRequest
3 голосов
/ 15 сентября 2011

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

try {
  Resource resource = null;
  try {
    resource = new Resource();
    // Use resource
  } finally {
    if (resource != null) {
      // release resource
    }
  }
} catch (Exception ex) {
  // handle exceptions thrown by the resource usage or closing
}

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

try {
  Connection connection = null;
  try {
    connection = ... // Get database connection
    // Use connection -- may throw exceptions
  } finally {
    if (connection != null) {
      connection.close(); // This can also throw an exception
    }
  }
} catch (SQLException ex) {
  // handle exceptions thrown by the connection usage or closing
}

Мне не нравится просто делать простой try-catch-finally, потому что я обязан поймать(возможное) исключение, которое может быть выдано, когда соединение с базой данных закрыто, и я никогда не уверен, как с этим справиться.

Есть ли лучший шаблон для обработки этой ситуации?

Ответы [ 3 ]

8 голосов
/ 15 сентября 2011

IOUtils.closeQuietly() может решить вашу проблему.

Пример:

    Closeable closeable = null;
    try {
        closeable = new BufferedReader(new FileReader("test.xml"));
        closeable.close();
    } catch (IOException e) {
        // Log the exception
        System.err.println("I/O error");
    } finally {
        // Don't care about exceptions here
        IOUtils.closeQuietly(closeable);
    }
8 голосов
/ 15 сентября 2011

Лично я использую следующий шаблон:

  Connection connection = null;
  try {
    connection = ... // Get database connection
    // Use connection -- may throw exceptions
  } finally {
    close(connection);
  }

private void close(Connection connection) {
  try {
    if (connection != null) {
      connection.close(); // This can also throw an exception
    }
  } catch (Exception e) {
    // log something
    throw new RuntimeException(e); // or an application specific runtimeexception
  }
}

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

Более чистым остается использование шаблона кредита.

2 голосов
/ 15 сентября 2011

Вы не должны ловить исключения, если не знаете, как с ними обращаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...