Какое правильное исключение .NET выдается при попытке вставить дубликат объекта в коллекцию? - PullRequest
6 голосов
/ 10 сентября 2008

У меня есть объект Asset, у которого есть свойство AssignedSoftware, которое является коллекцией.

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

Есть ли стандартное исключение .NET, которое я должен выдавать? Или лучшие практики требуют, чтобы я создал собственное исключение?

Ответы [ 6 ]

13 голосов
/ 11 сентября 2008

Почему InvalidOperationException был принят в качестве ответа ?! Это должно быть ArgumentException?!

InvalidOperationException следует использовать, если объект, имеющий вызываемый метод / свойство, не в состоянии справиться с запросом из-за неинициализированного состояния и т.д. но объект передается объекту (это обман). Подумайте об этом, если этот вызов Add никогда не выполнялся, будет ли объект все еще функционировать как обычно, ДА!

Это должно быть ArgumentException .

9 голосов
/ 10 сентября 2008

.Net вызовет исключение System.ArgumentException, если вы попытаетесь дважды добавить элемент в хеш-таблицу с одним и тем же значением ключа, так что это не выглядит как что-то более конкретное. Вы можете написать собственное исключение, если вам нужно что-то более конкретное.

5 голосов
/ 10 сентября 2008

Из Руководства по проектированию библиотеки классов для ошибок (http://msdn.microsoft.com/en-us/library/8ey5ey87(VS.71).aspx):

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

...

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

Бросить исключение InvalidOperationException, если вызов метода доступа или метода набора свойств не подходит с учетом текущего состояния объекта.

Мне кажется, что это сценарий «Недопустимое состояние объекта», поэтому я выбрал бы InvalidOperationException вместо ArgumentException: параметры действительны, но не на данном этапе жизни объектов.

5 голосов
/ 10 сентября 2008

Вы, вероятно, должны выбросить ArgumentException, так как это то, что делают классы базовой библиотеки.

1 голос
/ 10 сентября 2008

Ну, если вам действительно нужна коллекция с уникальными предметами, вы можете взглянуть на объект HashSet (доступен в C # 3.0).

В противном случае, вы можете воспользоваться двумя подходами:

  • Создайте пользовательское исключение для вашей операции, как вы заявили
  • Реализация метода Add (), который возвращает логический результат: true, если элемент добавлен, и false, если элемент уже имеет дубликат в коллекции

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

0 голосов
/ 10 сентября 2008

Мне всегда нравилось исключение InvalidOperationException. Однако вы также можете создать пользовательское исключение, например, DuplicateSoftwareAssignmentException.


Из руководящих принципов проектирования каркаса:

"Брось ArgumentException или создай исключение, полученное из этого класса если переданы неверные параметры или обнаружено.

Бросить исключение InvalidOperationException исключение, если вызов к набору свойств метод доступа или метод не подходит учитывая текущее состояние объекта. "

Текущее состояние включает ссылки на другие экземпляры класса. В этом случае состояние уже включает ссылку на добавляемый экземпляр, поэтому вызов метода неуместен.

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