Исключенные исключения исключаются, если вы хотите обрабатывать каждый сбой таким же образом, например, путем его регистрации и перехода к следующему запросу, отображения сообщения пользователю и обработки следующего события и т.д. Если это мой прецедент, все, что мне нужно сделать, - это уловить некоторый общий тип исключения на высоком уровне в моей системе и обрабатывать все одинаково.
Но я хочу оправиться от конкретных проблем, и я не уверен, что лучший способ приблизиться к нему с помощью исключенных исключений. Вот конкретный пример.
Предположим, у меня есть веб-приложение, построенное с использованием Struts2 и Hibernate. Если какое-то исключительное событие доходит до моего "действия", я регистрирую его и вывожу пользователю извинения. Но одной из функций моего веб-приложения является создание новых учетных записей пользователей, для которых требуется уникальное имя пользователя. Если пользователь выбирает имя, которое уже существует, Hibernate выбрасывает org.hibernate.exception.ConstraintViolationException
(неконтролируемое исключение) в кишки моей системы. Я действительно хотел бы оправиться от этой конкретной проблемы, попросив пользователя выбрать другое имя пользователя, вместо того, чтобы дать им сообщение "мы зарегистрировали вашу проблему, но теперь вы hosed".
Вот несколько моментов, которые следует учитывать:
- Там много людей создают учетные записи одновременно. Я не хочу блокировать всю таблицу пользователей между "SELECT", чтобы увидеть, существует ли имя и "INSERT", если это не так. В случае реляционных баз данных могут возникнуть некоторые приемы, чтобы обойти это, но меня действительно интересует общий случай, когда предварительная проверка исключения не будет работать из-за фундаментального состояния гонки. То же самое можно применить для поиска файла в файловой системе и т.д.
- Учитывая мою склонность к CTO для управления движением, вызванное чтением столбцов технологий в "Инк", мне нужен слой косвенности вокруг механизма сохранения, чтобы я мог выкинуть Hibernate и использовать Kodo или что-то еще, не меняя ничего кроме самого низкого уровня кода настойчивости. На самом деле в моей системе есть несколько таких уровней абстракции. Как я могу предотвратить их утечку, несмотря на неконтролируемые исключения?
- Одна из декларированных недостатков проверенных исключений - это "обрабатывать" их при каждом вызове стека, либо объявляя, что вызывающий метод бросает их, либо ловя их и обрабатывая их. Обработка их часто означает перенос их в другое проверенное исключение типа, соответствующего уровню абстракции. Так, например, на площадке с проверенными исключениями, реализация на основе файловой системы моего пользовательского реестра может ловить
IOException
, тогда как реализация базы данных будет ловитьSQLException
, но оба будут бросатьUserNotFoundException
, которая скрывает базовую реализацию, Как я могу воспользоваться исключенными исключениями, избавляя себя от бремени этой упаковки на каждом уровне, не пропуская подробности реализации?