У нас с коллегой возникли разногласия относительно наилучшей практики обработки исключений времени выполнения, возникающих из транзакционного кода JDBC. Он чувствует, что ловить Exception
вместо SQLException
- правильная практика.
Его аргумент в том, что Connection.close();
ведет себя неопределенно, если транзакция не была совершена. Некоторые реализации JDBC могут выполнять откат, в то время как другие могут выполнять фиксацию. Если вы просто перехватите SQLException
, то любое исключение во время выполнения будет иметь неопределенное поведение для close()
в блоке finally
.
В настоящее время считается лучшей практикой ловить Exception
, а если нет, как вы решаете ситуацию, которую он описывает?
Connection connection = null;
try {
connection = ...
// transactional code
} catch (final Exception e) {
connection.rollback();
} finally {
// close other resources
if (connection != null) { connection.close(); }
}