2008-09-10 6 views
4

У меня есть объект Asset, который имеет свойство AssignedSoftware, которое представляет собой коллекцию.Какое правильное исключение .NET для броска при попытке вставить дубликат объекта в коллекцию?

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

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

ответ

4

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

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

...

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

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

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

4

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

1

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

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

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

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

-1

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


Из принципов рамки дизайна:.

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

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

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

+0

IOE следует использовать только в том случае, если у вас есть операция, которая недействительна, например, добавление в коллекцию только для чтения, а не для недопустимого или плохого ввода ... – 2011-02-02 12:43:01

+0

@mP Я перевел мою цитату из руководства по разработке структуры в ответ. Как он утверждает, IOE правильно выбрасывается, когда вызов неуместен для текущего состояния объекта. – Will 2011-02-02 17:52:48

6

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

13

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

IOE следует использовать, если объект, имеющий вызываемый против него метод/свойство, не может справиться с запросом из-за состояния uninit'ed и т. Д. Проблема здесь не объект, который добавляется, но объект передается объекту (это обман). Подумайте об этом, если этот вызов Add никогда не состоялся, будет ли объект работать нормально, YES!

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