次のコードは、重複するコレクションアイテムの追加を防ぐために例外をスローする必要があります。
ICollection<T> collection = new List<T>();
public void Add(T item)
{
if (collection.Contain(item))
{
throw new SomeExceptionType()
}
collection.Add(item);
}
どの標準例外タイプが最も適切ですか?
そうですね、そのようなキーがすでに存在する場合、Dictionary<,>.Add()
はArgumentException
をスローするので、これは前例になる可能性があると思います。
ArgumentException おそらく最良でしょう。これは、引数が無効な場合にスローされる例外です。
Linqはさらに2つの例外を使用しますDuplicateNameExceptionおよびDuplicateKeyException system.dataAssemblyを使用している場合はこれらを使用できます。
InvalidOperationException
を使用します:
メソッド呼び出しがオブジェクトの現在の状態に対して無効である場合にスローされる例外。
引数の値の有効性はオブジェクトの状態(つまり、collection.Contains(item)
がtrueであるかどうか)に依存するため、これが使用するのに最適な例外だと思います。
発信者にとって何が問題であったかを明確にする適切なメッセージを例外に追加するようにしてください。
ArgumentExceptionが適切な例外になります(辞書はその例外も使用します)
System.ArgumentException
すでにコレクションにあるオブジェクトを追加することは無効であるため、InvalidOperationException
と言います
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);
}