Какое правильное исключение .NET выдает при попытке вставить дубликат объекта в коллекцию?

StackOverflow https://stackoverflow.com/questions/54789

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

...

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

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

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

Другие советы

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

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

Это должно быть АргументИсключение.

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

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

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

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

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

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

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


Из рекомендаций по проектированию каркаса:

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top