в какое пространство имен / пакет помещать исключения - PullRequest
5 голосов
/ 27 апреля 2010

Какова общая или лучшая практика для определения местоположения классов исключений?

Допустим, у вас есть пакеты / пространства имен myproject.person (модели и DAO для персон) и myproject.order (модели и DAO для заказов) и исключения PersonException и OrderException. Должен ли я поместить исключения в соответствующие пакеты или в отдельный пакет для исключений (например, myproject.exceptions)?

Первый подход кажется более разумным (поскольку он отсортирован по функциональности). Но возникает вопрос, где вы должны поместить исключения, связанные с обоими? например ConstraintViolationException

Спасибо

Ответы [ 7 ]

12 голосов
/ 27 апреля 2010

Делайте то, что делает библиотека классов Java. Поместите исключения в те же пакеты, что и классы API и интерфейсы, которые их генерируют.

12 голосов
/ 27 апреля 2010

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

8 голосов
/ 27 апреля 2010

Я бы поместил их в то же пространство имен, что и соответствующие им классы. Для более общих типов исключений вы должны попытаться поместить их в наиболее определенное пространство имен, которое охватывает классы, которые их используют, поэтому ConstraintViolationException будет помещаться в пространство имен myproject.

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

Представьте, что каждая сборка имеет свои собственные операции и множество типов исключений (не только PersonException или OrderException , но PersonInvalidDataException или PersonDataPersistException ). Эти исключения могут реализовывать BaseException, который регистрирует и отправляет электронную почту, например.

Так что, на мой взгляд, более доступный способ - разделить их по пространству имен.

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

Если исключение используется только для одного класса или группы классов функций, поместите его рядом с ними. Если Exception имеют общее значение для библиотеки jr приложения, поместите ее в пространство имен oun. ИМХО

0 голосов
/ 27 апреля 2010

Проблема, с которой я столкнулся во всей этой идее, заключается в том, что исключения должны, как правило, создаваться в соответствии с тем, что может пойти не так, например, NullPointerException, тогда как PersonException, по-видимому, относится к объекту, связанному с любой катастрофой, разворачивающейся без давая понять, что пошло не так. Объект Person вызвал исключение? Это потому, что у Человека есть внутренняя логическая проблема, или потому что плохие аргументы были предоставлены одному из его методов? Или исключение произошло из-за того, что лицо не было найдено в базе данных?

Тот факт, что вы думаете об исключениях, относящихся к обоим объектам, просто усиливает мои опасения. Я предлагаю переосмыслить дизайн ваших исключений (EntityNotFoundException, BadArgumentException, MinorCannotOrderPornException) и, надеюсь, ответ на вашу дилемму будет более очевидным.

0 голосов
/ 27 апреля 2010

Я просто храню все исключения в пространстве имен проекта (т.е. myproject). Они могут занимать место в представлении проекта, если вы создаете один файл для каждого класса, поэтому я обычно называю файл (исключения) .cs, чтобы они отображались вверху, и помещал все исключения в одном месте.

Если это большой проект, то обычно разбивают сборки на разные пространства имен, и каждое пространство имен получает свой собственный набор исключений, но мы говорим о более чем 100 классах на сборку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...