Как и где вы определяете свою собственную иерархию исключений в Java? - PullRequest
29 голосов
/ 21 апреля 2010

Как и где вы определяете свою собственную иерархию исключений в Java?

Мой главный вопрос касается местоположения пакета, в котором должны быть определены ваши классы исключений.

Мы создаем специальный пакет для наших исключений и помещаем в него все классы?

Ответы [ 4 ]

28 голосов
/ 21 апреля 2010

Я использую это как общее правило.

  • Там, где это имеет смысл, используйте предопределенное исключение Java. Например, если в вашем коде есть какая-то ошибка ввода-вывода, можно сгенерировать исключение IOException.
  • Используйте иерархии исключений, только если вам необходимо различать два исключения в блоке try / catch. Часто прекрасно, чтобы один компонент выдавал один тип исключения с разными сообщениями для разных ошибок. Если пользователь не может ничего сделать для обработки ошибки, используйте тот же универсальный класс исключений. Если пользователь может обрабатывать их по-разному, тогда вам следует использовать иерархию.
  • Для иерархий не делайте все исключения из разных компонентов наследуемыми от базового исключения. Нет никакой реальной причины сделать это. Если потребитель хочет что-то поймать, он может просто поймать исключение.
  • Для определения местоположения я поместил класс Exception с кодом, к которому он относится. Так что, если у меня есть BusinessService в пакете a.b.c, у меня есть a.b.c.BusinessException для этого. Я не фанат помещения всех исключений в пакет исключений. Это просто затрудняет поиск.
12 голосов
/ 21 апреля 2010

Я положил все свои пользовательские исключения в пакет com.company.project.exception. Я делаю это, а не помещаю их «близко» к местам, где они возникают.

Вот мое рассуждение: если данное исключение возникает только в одном или двух классах обслуживания где-то, это может быть недостаточно общим исключением, чтобы заслужить свой собственный класс. Только если я увижу общую тему, появляющуюся в нескольких местах, я начну создавать собственный класс исключений. И если он появляется в нескольких местах, то нет логического пакета, к которому его можно «прикрепить», поэтому пакет для конкретного исключения кажется правильным решением.

5 голосов
/ 21 апреля 2010

Вы можете создавать свои классы исключений в любом месте.

Важно расширить существующий класс Exception (на самом деле java.lang.Throwable). Например, java.lang.Exception или java.lang.RuntimeException. Первое - проверенное исключение, в то время как расширение RuntimeException приведет к непроверенному исключению; различия между ними подробно описаны здесь .

1 голос
/ 21 апреля 2010

Язык не определяет какие-либо требования к тому, какие пакеты должны быть добавлены пользовательскими Exception классами. Пока класс расширяется java.lang.Throwable, он может быть брошен.

...