button('hey')
вызывает функцию, а не устанавливает ее как обратный вызов.
Напишите класс 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()
)
{
...
}
Обычно вы не хотите делать ничего, кроме регистрации исключения, которое происходит при закрытии ресурса, поэтому оно действительно должно идти в собственном try / catch. Однако это общий код, который будет часто повторяться, поэтому не повторяйте себя и закрывайте статический метод (как предлагает Ник Холт), чтобы у вас не было двух элементов try / catch в одном методе, упрощение чтения и понимания кода.
Как уже упоминалось, статическая 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) {
...
}
}
}
Commons-io также имеет closeQuietly () для входящего и выходного потоков. Я постоянно им пользуюсь. Это делает ваш код более читабельным.
Не сомневайтесь, сделайте еще одну попытку ... наконец-то поймайте внутрь.
просто помните ... наконец, всегда запускайте выполнение с помощью try или catch ..
Я обычно делал это следующим образом:
try {
try {
..
stmts
...
}
finally {
connection.close():
}
} catch (Exception ex) {
..
stmts
..
}
Я обычно использовал это только тогда, когда я не использовал библиотеку, которая позаботилась об этом за меня.
Как указывает Imagist , технически это не то же самое, что finally будет выполняться до перехвата, но я думаю, что это решает проблему, которую вы пытались решить.