почему мы не можем сделать то же самое для каждого проверенного исключения в Java
Мы абсолютно можем сделать это каждый раз, когда это полезно.Как и в случае, который вы описываете.
Может ли кто-нибудь объяснить реальное преимущество этого?
Вы должны понять, насколько полезен SQLException
на самом деледля вашей бизнес-логики.Ответ: не совсем.Вы почти никогда не принимаете решений в своем коде на основе SQLException
.Если вы поймаете SQLException
, вы не сможете использовать его информацию (например, сообщение, код), чтобы каким-то образом ветвиться в вашей бизнес-логике.Единственное исключение, о котором я знаю, это DuplicateKeyException
, который можно использовать для определения того, что значение (например, имя для входа или адрес электронной почты) уже существует, и, таким образом, вы можете пропустить один выбор, чтобы повысить производительность.
Итак, ваш DAO не может использовать его, ваш сервис тоже, поэтому вам нужно распространить его на контроллер, перехватить, откатить транзакцию и вывести сообщение об ошибке пользователю.На самом деле, рамки делают это для вас.Они позволяют вам декларативно запускать транзакцию (@Transactional
), автоматически выполнять откат, если с вашего контроллера вылетает исключение, и выводить сообщение об ошибке, используя некоторые ExceptionHandler
.
Итак, вы видите, что вы действительно хотитеРаспространите эти исключения из вашей бизнес-логики (DAO, сервис, контроллер) в платформу.Если бы эти исключения были проверены, вам нужно было бы объявить throws
во всех методах в цепочке.
Вот где обертка для непроверенных исключений становится хорошей практикой.Они уменьшают шаблон throws
в коде.