Ответ 1
Ну, Dictionary<,>.Add()
throws ArgumentException
, если такой ключ уже существует, поэтому я предполагаю, что это может быть прецедентом.
Следующий код должен выдавать исключение, чтобы предотвратить добавление дублирующего элемента коллекции.
ICollection<T> collection = new List<T>();
public void Add(T item)
{
if (collection.Contain(item))
{
throw new SomeExceptionType()
}
collection.Add(item);
}
Какой стандартный тип исключения является наиболее подходящим?
Ну, Dictionary<,>.Add()
throws ArgumentException
, если такой ключ уже существует, поэтому я предполагаю, что это может быть прецедентом.
ArgumentException, вероятно, будет лучшим. Это исключение, выдаваемое, когда аргумент недействителен.
Linq использует еще два исключения DuplicateNameException и DuplicateKeyException, если вы используете сборку system.data.
Я бы использовал InvalidOperationException
:
Исключение, которое бросается, когда вызов метода недействителен для текущее состояние объекта.
Поскольку значение аргумента зависит от состояния объекта (то есть, истинно ли оно /t collection.Contains(item)
), я считаю, что это лучшее исключение для использования.
Убедитесь, что вы добавили хорошее сообщение в исключение, которое дает понять, что проблема была с вызывающим.
ArgumentException будет правильным исключением (словарь также использует это исключение)
System.ArgumentException
Я бы выбрал ArgumentException. Это то, что общий System.Collections.Generic.SortedList<>
делает в своем методе Add
.
Из кода .NET Framework 2.0:
public void Add(TKey key, TValue value)
{
if (key == null)
{
System.ThrowHelper.ThrowArgumentNullException(System.ExceptionArgument.key);
}
int num = Array.BinarySearch<TKey>(this.keys, 0, this._size, key, this.comparer);
if (num >= 0)
{
System.ThrowHelper.ThrowArgumentException(System.ExceptionResource.Argument_AddingDuplicate);
}
this.Insert(~num, key, value);
}
Я бы сказал InvalidOperationException
, потому что недопустимо добавлять объект, уже находящийся в коллекции