Реализация Spring обработки исключений в JDBCTemplate. - PullRequest
1 голос
/ 15 января 2012

Я изучаю Весеннюю книгу, чтобы выучить Весну.Пройдя через разделы о JDBCTemplate, я с удивлением обнаружил, что Spring по-разному обрабатывает большинство исключений SQLException.

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

По моему опыту, большинство исключений SQL должно быть обработано.Например, у нас есть приложение, которое взаимодействует с процедурой Oracle PL / SQL.Вызов процедуры PL / SQL может вернуть исключение ORA-01403: no data found.Это исключение, которое вы обычно восстанавливаете, отображая сообщение об ошибке пользователю.Например, результат поиска ничего не дал.

Как будет обрабатываться такого рода проверенное исключение в Spring, если все исключения сняты, т. Е. Spring не заставит вас обрабатывать их?

Я знаю, что вы можете перехватывать RuntimeExceptions, но мне очень понравилась идея, что вы вынуждены обрабатывать проверенные исключения.Какое преимущество дает преобразование некоторых из проверенных исключений в не проверенные исключения?

Ответы [ 3 ]

4 голосов
/ 15 января 2012

Да, исключения должны обрабатываться, но в дизайне Spring на более высоком уровне, чем каждый метод DAO.Фактически дизайн, в котором в каждом методе есть обработка SQLException, является нечистым дизайном копирования и вставки, и когда вы что-то меняете, вы должны применять это изменение в каждом месте.

Существуют различные требования и различные места, где выобрабатывать непроверенные исключения.Одним из них являются аспекты , где вы можете, например, преобразовать исключения Spring в ваши исключения (необнаруженные исключения не нужно объявлять в сигнатуре метода, поэтому это преобразование очень элегантно).В методе REST вы можете добавить универсальный обработчик, который будет возвращать ответ об ошибке вызывающей стороне, и вы будете писать обработку исключений только в одном месте.В технологиях, основанных на JSF / JSP , вы можете добавить собственную страницу ошибки при возникновении ошибки.

2 голосов
/ 16 января 2012

Некоторым людям не нравятся проверенные исключения, так как они заставляют вас управлять некоторыми исключениями.Я думаю, что ребята из Spring такого рода.

Лично я предпочитаю делать то, что было задумано:

try {
    // execute some SQL
} catch (SQLException ex) {
    if (ex is an expected condition) {
        // deal with it: for example with a "no data found" condition
        // this might mean returning null, or throwing some kind of business exception, such as
        // NoEmployeeFoundException, or whatever
    } else {
        // this is a programming / environment error
        // throw as unchecked exception
        throw new RuntimeException(ex);
    }
}

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

2 голосов
/ 15 января 2012

Преимущество не заставляет их ловить или объявлять.

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

Многие ошибки, связанные с SQL, связаны с кодом; ИМО, лучше быстро провалиться - во время разработки.

...