Использование класса ValidationException - PullRequest
7 голосов
/ 22 февраля 2011

У меня есть ситуация, когда один из наших разработчиков хочет внедрить стандарт, в который мы добавляем System.ComponentModel.DataAnnotations.ValidationExceptions во всех наших приложениях, движущихся вперед. Примером может служить то, что пользователь вводит неверные данные в форму, а наш уровень бизнес-логики создает исключение ValidationException, которое обрабатывается на вызывающем уровне.

Однако меня беспокоит, что этот класс исключений используется вне контекста и что однажды мы будем использовать некоторые Динамические элементы управления данными, которые используют это исключение, и будет трудно определить разницу между тем, когда он создает использование исключения ValidationException против случаев, когда динамические элементы управления вызывают исключение.

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

Есть мнения?

1 Ответ

9 голосов
/ 05 марта 2011

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

Я думаю, что это главноеТочка, на которую вам следует обратить внимание при принятии этого решения.

Похоже, вы подразумеваете, что вышесказанное (неспособность отличить ваши собственные исключения от исключений «платформы») является плохой вещью.Это не обязательно так.ЕСЛИ вы используете ValidationException исключительно для представления ошибок проверки, тогда весь ваш код может корректно обрабатывать как ваши собственные, так и исключения платформы одинаково.Нет необходимости в особых случаях исключений платформы из пользовательских.

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

Так что я считаю, что использование платформы ValidationException, вероятно, является хорошим способом сделать это, если вы используете ее строго для распространения проблем проверки.

Также подумайте о том случае, когда вы будете передавать / продавать части своего кода третьей стороне (скажем, это действительно круто, и вы делаете из этого продукт).Возможно, третьему лицу было бы проще, если бы ваш модуль генерировал «стандартные» исключения (они могут легко его интегрировать), а не занимался бы специальным случаем всего кода своего интерфейса для вашего модуля.Опять же, это справедливо только в том случае, если вы придерживаетесь случаев, когда стандартный модуль будет генерировать ValidationExceptions.

Давайте посмотрим на это с другой стороны.Вы говорите:

наш уровень бизнес-логики выдает исключение ValidationException

Именно поэтому я ставлю строго и исключительно выше.Вы должны убедиться, что согласны с ошибкой проверки.Давайте рассмотрим две гипотетические проблемы:

  1. «abc» не является допустимым числом
  2. недостаточно средств для этой операции

Для 1. проблема проста / ожидаемая проверка вводаошибка.Но на мой взгляд 2. нет.Это проблема бизнес-логики.Вы можете назвать это проблемой проверки (в транзакции перед дебетом вы «проверяете», есть ли достаточно средств), но я бы сказал, что это семантически очень отличается.

Я бы посоветовал не ставить этидва типа ошибок в одном и том же исключении "мешок", поскольку они имеют очень разные значения и могут (часто) приводить к разной логике потока приложений.(В приведенных выше двух примерах 1. должен держать пользователя в той же форме, как и любой другой тип «опечатки», но 2. вероятно, он должен перенаправить его на страницу, которая позволит ему пополнить свой счет.)

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

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