Как и где вы определяете собственную иерархию Exception в Java?
Как и где вы определяете собственную иерархию Exception в Java?
Мой главный вопрос касается расположения пакетов, где должны быть определены классы Exception.
Создаем ли мы специальный пакет ourexceptions и помещаем в него все классы?
Ответы
Ответ 1
Я использую это как общее правило.
- Где это имеет смысл, используйте предопределенное исключение Java. Например, если у вашего кода есть некоторая ошибка ввода-вывода, то отлично использовать исключение IOException.
- Используйте только иерархии исключений, если вам нужно различать два исключения в блоке try/catch. Много раз отлично, чтобы один компонент выбрал один тип исключения с разными сообщениями для разных ошибок. Если пользователь не может действительно что-либо сделать для обработки ошибки, используйте тот же общий класс исключений. Если пользователь может обрабатывать их по-разному, то есть когда вы должны использовать иерархию.
- Для иерархий не делайте все исключения из разных компонентов наследуемыми от базового исключения. Для этого нет реальной причины. Если потребитель хочет что-то поймать, они могут просто перехватить исключение.
- В отношении расположения пакета я помещаю класс исключения с кодом, к которому он относится. Поэтому, если у меня есть BusinessService в пакете a.b.c, у меня есть a.b.c.BusinessException, чтобы пойти с ним. Я не поклонник поместить все исключения в пакет исключений. Это просто затрудняет поиск.
Ответ 2
Я поместил все свои пользовательские исключения в пакет com.company.project.exception
. Я делаю это, а не помещаю их "близко" к местам, где они появляются.
Здесь мои рассуждения: если данное исключение только возникает в одном или двух классах сервисов где-то, это может быть не достаточно общее исключение, чтобы заслужить его собственный класс. Только если я увижу, что общая тема появляется в нескольких местах, я пойду на проблему создания настраиваемого класса исключений. И если он появляется в нескольких местах, тогда нет никакого логического пакета для "прикрепления" его, поэтому пакет, зависящий от исключения, кажется правильным путем.
Ответ 3
Вы можете создавать классы Exception везде, где хотите.
Важно расширить существующий класс Exception (фактически java.lang.Throwable
). Например java.lang.Exception
или java.lang.RuntimeException
. Первое - это проверенное исключение, а расширение RuntimeException приведет к неконтролируемому исключению; различия между ними подробно описаны здесь.
Ответ 4
Язык не указывает каких-либо требований к тем, для каких пакетов должны быть помещены пользовательские классы Exception
. Пока класс расширяет java.lang.Throwable
, он может быть сброшен.