Spring frame work Wraps Проверенные исключения внутри RuntimeExceptions

Вызов этого метода -> simpleJdbcTemplate.queryForInt(sql,null); -> Метод queryForInt() в источниках SimpleJdbcTemplate создает исключение DataAccessException, которое является исключением времени выполнения. я хочу распространять исключения на уровне представления приложения, так как работа с Spring работает Обтекание Проверено Исключения внутри RuntimeExceptions Я застрял здесь

Как мне это сделать?

Объяснение 1:

Преимущество, предоставляемое средой абстракции JDBC Spring Framework - говорят, что Spring Framework заботится обо всем, кроме 3 и 6. 3 и 6 должны быть написаны разработчиком приложения

  1. Определить параметры подключения
  2. Откройте соединение
  3. Укажите утверждение
  4. Подготовить и выполнить заявление
  5. Настройте цикл для итерации по результатам (если есть)
  6. Делать работу для каждой итерации
  7. Обработать любое исключение
  8. Обрабатывать транзакции
  9. Закрыть соединение

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

как мне решить это?

3 ответа

Решение

Это зависит от того, отлавливает ли ваш уровень просмотра проверенные исключения (любой подкласс throwable, который не является подклассом RuntimeException или Error, или не является экземплярами RuntimeException или Error напрямую) или непроверенные исключения (RuntimeException или Errors или подклассы этих Throwable подклассов).

Как правило, у вас будет что-то вроде этого:

try {
//... processing
} catch(Exception/RuntimeException e) {
// propagate the exception to the view in a meaningful manner
}

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

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

try {
//...spring code
} catch(DataAccessException e) {
throw new Exception(e);
}

Затем ваш слой выше этой обработки поймает его как проверенное исключение.

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

try {
    // query logic
} catch (DataAccessException ex) {
    // handle the exception
}

Если вы используете среду MVC Spring, возможно, стоит заглянуть в интерфейс ExceptionResolver. Это механизм принятия решения о том, как обрабатывать все эти неперехваченные исключения, создаваемые нижними уровнями приложения. Это дает вам последний шанс отобразить другое представление в зависимости от выданных исключений.

Вы просто хотите иметь доступ к исходной информации об исключениях в вашем View? Если это так, вы должны иметь возможность вызывать getCause() для RuntimeException, чтобы получить проверенное исключение, вызвавшее его. В противном случае вам нужно будет добавить объявление "throws" в ваши методы, которые используют SimpleJdbcTemplate, перехватить DataAccessException и повторно выбросить проверенные исключения, которые упакованы.

Другие вопросы по тегам