Spring Frame work Wraps Проверенные исключения внутри RuntimeExceptions - PullRequest
3 голосов
/ 14 мая 2009

У этого вызова метода:

   ->
    simpleJdbcTemplate.queryForInt(SQL,null);
   ->

queryForInt() метод в пружинах SimpleJdbcTemplate выдает DataAccessException, что является исключением времени выполнения. Я хочу распространить исключения на уровень представления приложения, поскольку работа с Spring работает с Wraps Checked Exceptions в RuntimeExceptions Я застрял здесь.

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

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

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

  1. Определить параметры подключения

  2. Открыть соединение

  3. Укажите выписку

  4. Подготовить и выполнить инструкцию

  5. Настройка цикла для перебора результатов (если есть)

  6. Выполняйте работу для каждой итерации

  7. Обработка любого исключения

  8. Обработка транзакций

  9. Закрыть соединение

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

Ответы [ 3 ]

7 голосов
/ 14 мая 2009

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

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

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

1 голос
/ 14 мая 2009

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

1 голос
/ 14 мая 2009

Это зависит от того, перехватывает ли ваш уровень просмотра проверенные исключения (любой подкласс 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);
}

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

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