2009-08-14 25 views
16

El siguiente código debe arrojar una excepción para evitar agregar elementos duplicados de la colección.¿Qué tipo de excepción se debe arrojar al intentar agregar elementos duplicados a una colección?

ICollection<T> collection = new List<T>(); 

public void Add(T item) 
{ 
    if (collection.Contain(item)) 
    { 
      throw new SomeExceptoinType() 
    } 

    collection.Add(item); 
} 

¿Qué tipo de excepción estándar es el más apropiado?

+1

La excepción específica más cercana que encontré fue [DuplicateNameException] (https://msdn.microsoft.com/en-us/library/system.data.duplicatenameexception (v = vs.110) .aspx) para bases de datos ... que es solo una mala idea para una 'Colección'. Para llevar a casa el mensaje: Cualquier persona que desee algo más específico podría rodar su propia Exception_ – KCD

Respuesta

22

Bueno, Dictionary<,>.Add() tiros ArgumentException si dicha clave ya existe, así que supongo que esto podría ser un precedente.

2

me gustaría utilizar InvalidOperationException:

La excepción que se produce cuando una llamada método es válido para el estado actual del objeto .

Desde la validez del valor del argumento es contingente sobre el estado del objeto (es decir si es o no es cierto collection.Contains(item)) Creo que esta es la mejor excepción de usar.

Asegúrese de agregar un buen mensaje a la excepción que aclare cuál fue el problema para la persona que llama.

+1

en mi humilde opinión, InvalidOperationException confundirá al usuario porque usó principalmente para mostrar una secuencia de opacidad inapropiada. Por ejemplo, leyendo de un lector cerrado, etc. – klashar

2

ArgumentException sería la excepción adecuada (Diccionario utiliza esa excepción, así)

1
System.ArgumentException 
-1

diría InvalidOperationException, ya que no es válida para agregar un objeto que ya está en la colección

+0

Si fuera un diccionario, esto sería cierto, pero no lo es. – Brandon

+0

Hay colecciones que no permiten duplicados, Y diccionarios que las permiten ... en el caso del póster claramente no quiere duplicados, o ¿por qué querría lanzar una excepción? –

+0

Lo siento, dije mal ese comentario, más me refiero a decir que si el OP está utilizando una colección que permite duplicados, no es realmente una operación no válida. Es una cosa de "él no considera esto válido". Tampoco soy el que rechazó este> _> No estoy de acuerdo con que esta sea la mejor excepción, pero no creo que sea un error usarla. – Brandon

1

que lanzaba una excepción ArgumentException. Eso es lo que hace el genérico System.Collections.Generic.SortedList<> en su método Add.

A partir del código .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); 
    } 
2

LINQ utiliza dos excepciones más DuplicateNameException y DuplicateKeyException se pueden utilizar estos si está utilizando el montaje system.data.

Cuestiones relacionadas