Почему SQLException - проверенное исключение

Может ли кто-нибудь подумать о разумной причине, почему SQLException является проверенным исключением?

Да, в запросе может возникнуть синтаксическая ошибка
Да, связь, возможно, умерла Да, может быть проблема разрешения
Etc и т.д. Blah blah blah

Но практически в 100% случаев (когда вы работаете на производстве), проблем нет.

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

Проверяется создание массивов поверхностных блоков try catch по всему коду, так как все, кто был вовлечен в проект, использующий JDBC, подтвердят. Кодовый беспорядок является значительным.

Из-за эзотерической природы SQL, множество причин, по которым вы можете получить SQLException и их сложность, означает, что вы в принципе не можете восстановить, если исключение не вызвано временной сетевой проблемой, но даже тогда при синхронном вызове, так или иначе, потому что вы не можете ждать бесконечно, чтобы проблема сети была решена, поэтому вам придется выполнить транзакцию.

Как правило, вызов SQL выглядит следующим образом:

try {
    // make some SQL call(s)
} catch {SQLException e) { 
    // log the exception
    return; // and give up
}

Такой код не добавляет значения. Там ничего разумного вы не можете сделать, чтобы выздороветь. Возможно, вы также можете создать исключение для среды выполнения, т.е. SQLException должен быть исключением (непроверенным).

Ответ 1

практически в 100% случаев нет проблем - это ограничивается вашим собственным наблюдением, которое ничего не говорит о других системах. Существуют различные компьютерные системы по всему миру с различными узкими местами. Ваш коэффициент успеха составляет почти 100%. Другие должны иметь дело с гораздо меньшим процентом.

Общее заблуждение заключается в том, чтобы рассмотреть возможность введения/удаления Проверенного исключения с помощью частоты его возникновения. Проверенные исключения служат каналами связи. Как вы знаете, каждый метод имеет свой открытый интерфейс. Таким образом, метод сообщает нам, какие аргументы он принимает и что является результатом кода в его теле.

Когда становится невозможным выполнение текущего способа, чтобы сохранить свое обещание (например, возвращаемое значение), ему нужен способ сообщить другому методу, что что-то пошло не так, и он не может делать то, что ожидалось. Но как это сделать? Отправка сообщения, поскольку возвращаемое значение не работает, почти нет возможности для метода вызова различать правильное значение и сообщение об ошибке. Не сказать, что некоторые методы имеют пустоту как возвращаемое значение. Итак, что вы делаете, когда не можете сохранить свое обещание, определенное вашим интерфейсом метода? Ну, вы бросаете исключение (отправляете сообщение).

Если вы ожидаете, что ResultSet и не будет установлено соединение с вашей базой данных, что вы должны делать? Вернуть пустой ResultSet? Ад нет, это говорит нам, что база данных пуста. Вернуть null? Ну, это только делегирует проблему и затрудняет поиск причины.

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

Без SQLException даже одна ошибка может привести к несогласованности данных.

Ответ 2

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

Итак, метод, который загружает информацию из базы данных, не должен поднимать SQLException, а скорее ResourceNotFoundException или ResourceUnavailableException.

Выполнение проверки SQLException - это способ заставить разработчика поймать Исключение и обернуть его на этом новом уровне абстракции.

Этот аргумент взят из "Эффективного Java Second Edition" Джошуа Блоха (пункт 61: "Исключить исключения", соответствующие абстракции).

Ответ 3

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

Вы не можете восстановить из SQLException, что вы не можете сделать это, чтобы исправить эту проблему во время выполнения, но есть некоторые полезные вещи, которые вы можете сделать:

  • Записать исключение для отладочной информации
  • Откат транзакции

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

Если вы сделаете что-то вроде:

try { ... }
catch(SQLException e) 
{ 
    SomeLogger.log(...);
    rollback();
    throw e;
}

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

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

Ответ 4

Существует несколько подходов к проверенной и неконтролируемой дилемме. Проверка того, может ли вызывающий код восстанавливаться из исключения или нет, является одним из подходов, однако, я согласен, не объясняет, почему SQLExcption является проверенным исключением.

Другой, предоставленный Мартином Фаулером в его великой книге "Рефакторинг", предлагает проверить, насколько ответственным является вызов или вызываемый метод, чтобы сделать проверку, которая может привести к исключению.

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

Теперь, если это вызов вызываемого метода, чтобы выполнить проверку, потому что только этот метод может знать, как выполнить такую ​​проверку, необходимо проверить исключение, вызванное вызываемым методом.

В случае SQLException я думаю, что только этот класс может знать:

  • в запросе есть синтаксическая ошибка, так как это зависит от базы данных
  • связь умерла
  • есть проблема с разрешением