каковы преимущества определения пользовательского исключения?


Есть ли серьезные причины для определения исключений custome в Java?

6 5

6 ответов:

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

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

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

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

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-all.

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

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

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

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

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

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

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