Исключенные исключения - это хорошо, если вы хотите обрабатывать все сбои одинаково, например, путем регистрации и перехода к следующему запросу, отображения сообщения пользователю и обработки следующего события и т. Д. Если это мой прецедент, все, что мне нужно сделать, - это уловить какой-то общий тип исключения на высоком уровне в моей системе и обрабатывать все одинаково.Как я могу оправиться от неконтролируемого исключения?
Но я хочу оправиться от конкретных проблем, и я не уверен, что лучший способ приблизиться к нему с помощью исключенных исключений. Вот конкретный пример.
Предположим, у меня есть веб-приложение, построенное с использованием Struts2 и Hibernate. Если какое-то исключительное событие доходит до моего «действия», я регистрирую его и вывожу пользователю извинения. Но одной из функций моего веб-приложения является создание новых учетных записей пользователей, для которых требуется уникальное имя пользователя. Если пользователь выбирает имя, которое уже существует, Hibernate бросает org.hibernate.exception.ConstraintViolationException
(непроверенное исключение) вниз в кишки моей системы. Я бы очень хотел оправиться от этой конкретной проблемы, попросив пользователя выбрать другое имя пользователя, вместо того, чтобы дать им такое же сообщение «Мы зарегистрировали вашу проблему, но теперь вы на вас».
Вот несколько моментов, чтобы рассмотреть следующие вопросы:
- Там много людей, создающих счетов одновременно. Я не хочу блокировать всю таблицу пользователей между «SELECT», чтобы увидеть, существует ли имя и «INSERT», если это не так. В случае реляционных баз данных могут возникнуть некоторые приемы, чтобы обойти это, но меня действительно интересует общий случай, когда предварительная проверка исключения не будет работать из-за фундаментального состояния гонки. То же самое можно применить и к поиску файла в файловой системе и т. Д.
- Учитывая склонность моего КТО к управлению движением, вызванную чтением столбцов технологии в «Инк.», Мне нужен слой косвенности вокруг механизма сохранения, поэтому что я могу выкинуть Hibernate и использовать Kodo или что-то еще, не изменяя ничего, кроме самого низкого уровня кода настойчивости. На самом деле в моей системе есть несколько таких уровней абстракции. Как я могу предотвратить их утечку, несмотря на неконтролируемые исключения?
- Одна из декламированных недостатков проверенных исключений заключается в том, чтобы «обрабатывать» их в каждом вызове в стеке — либо путем объявления, что вызывающий метод их бросает, либо ловя их и обрабатывая их. Обработка их часто означает перенос их в другое проверенное исключение типа, соответствующего уровню абстракции. Так, например, на сайте checked-exception land файловая система – на основе моего UserRegistry может поймать
IOException
, в то время как реализация базы данных поймаетSQLException
, но оба бросятUserNotFoundException
, который скрывает базовую реализацию. Как я могу воспользоваться исключенными исключениями, избавляя себя от бремени этой упаковки на каждом уровне, не пропуская детали реализации?
Мой, хотя точно – 2009-03-05 09:51:28