Каковы преимущества определения пользовательских исключений? - PullRequest
6 голосов
/ 09 марта 2011

Какие-либо серьезные причины для определения исключений обычного в Java?

Ответы [ 6 ]

12 голосов
/ 09 марта 2011

На ум сразу приходят две причины:

  1. Просто, чтобы вы не сказали try { ... } catch (Exception e) { ... } - наличие ваших собственных подклассов позволяет вам обрабатывать отдельные случаи исключений отдельно. (Например, разница между отсутствием разрешений на запуск отчета и сбоем выполнения отчета).
  2. Вы можете добавить дополнительный контекст - например, если у вас есть собственный AlreadyLoggedInException, скажем, у этого исключения может быть метод для получения IP-адреса, с которого был запущен другой сеанс. Или AccountLimitExceededException может содержать ограничение текущего счета. Дополнительная информация в исключении позволяет вам получить более информированный ответ при ее обнаружении.
2 голосов
/ 09 марта 2011

Проще говоря, это позволяет вам правильно обрабатывать каждое исключение.

Рассмотрим следующий код

try {
   doSomethingThatCouldThrowManyExceptions();

}
catch (ExceptionalCircumstance1 ex) {
   // deal with this specific circumstance
}
catch (ExceptionalCircumstance2 ex) {
   // deal with this specific circumstance
}
catch (ExceptionalCircumstance3 ex) {
   // deal with this specific circumstance
}
finally {
   // do some common code
}

Без этого вам не удастся сделать улов-все типы исключений.

Если, тем не менее, будет подхвачено все, то иерархия классов по-прежнему означает, что вы все равно можете перехватывать все исключения, используя catch(Exception ex) {}.

2 голосов
/ 09 марта 2011

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

1 голос
/ 09 марта 2011

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

0 голосов
/ 09 марта 2011

На мой взгляд, основной мотивацией для пользовательских исключений является достижение лучшего моделирования предметной области вашего приложения. При разработке классов вы тратите много усилий, чтобы назвать объекты и распределить их обязанности. Я думаю, что на данный момент некоторые усилия по рассмотрению возможных условий ошибки - это хорошая инвестиция. Например, при копании глубже клиенты часто могут дать вам несколько общих примеров, которые необходимо обработать (например, неверные данные, нарушение логических ограничений, ненадежные датчики и т. Д.). В результате у вас будет код, который легче понять и изменить. Специфичные для приложения ошибки хорошо разделены, и обработка дополнительных ошибок может быть легко достигнута.

Другой момент заключается в том, что он может обеспечить лучшую абстракцию для разных частей системы. Например, если вы действительно ожидаете, что реализация части персистентности изменится в будущем, тогда гораздо лучше использовать пользовательские исключения в ее API. В противном случае вам будет очень весело работать с SQLException или SAXException в разных местах: -)

0 голосов
/ 09 марта 2011

За пользовательским исключением вы можете сообщить своим абонентам, что произошла ошибка определенного типа, а не просто ошибка. И вызывающие абоненты, таким образом, могут делать что-то особенное для такого рода ошибок.

Давайте воспользуемся аналогией с автомобилем: вы предпочитаете, чтобы ваша машина отказывалась начинать с мигающего уникального красного индикатора или с мигающим индикатором "пустой бензобак"?

...