¿Cuál es la correcta .NET excepción a tirar cuando intenta insertar un duplicado de un objeto en una colección?

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Tengo un Activo objeto que tiene una propiedad AssignedSoftware, que es una colección.

Quiero para asegurarse de que la misma pieza de Software no está asignado a un Activo más de una vez.En el método Add puedo comprobar para ver si el Software ya existe, y si lo hace, quiero lanzar una excepción.

Hay un estándar .NET excepción de que debo tirar?O ¿las mejores prácticas dictan puedo crear mi propio excepción personalizada?

¿Fue útil?

Solución

La Biblioteca de la Clase de diseño de directrices para los errores (http://msdn.microsoft.com/en-us/library/8ey5ey87(VS.71).aspx):

En la mayoría de los casos, el uso de los tipos de excepción predefinidos.Sólo definir nuevos tipos de excepción para escenarios de programación, donde se espera que los usuarios de la biblioteca de clase para la captura de excepciones de este nuevo tipo y realizar los programas de acción basado en el tipo de excepción a sí mismo.Esto es en lugar de analizar la excepción de la cadena, lo que afectaría negativamente a su rendimiento y mantenimiento.

...

Lanzar una excepción ArgumentException o crear una excepción derivada de esta clase si los parámetros no válidos se pasan o se ha detectado.

Lanzar la excepción InvalidOperationException si una llamada a una propiedad descriptor de acceso set o método no es apropiado, dado el objeto del estado actual.

Esto parece como un "estado de Objeto no válido" escenario a mí, así que me quedaría con excepción InvalidOperationException más de ArgumentException:Los parámetros son válidos, pero no en este momento en los objetos de la vida.

Otros consejos

¿Por qué ha InvalidOperationException sido aceptado como la respuesta?!Debe ser un ArgumentException?!

InvalidOperationException debe ser utilizado si el objeto que tiene la propiedad de método llamado en contra de ella no es capaz de lidiar con la solicitud debido a uninit ed estado, etc.El problema aquí es no es el objeto que se Añade a, pero el objeto se pasa al objeto (es un duplicado). Piense en ello, si este Complemento de la llamada, nunca tuvo lugar, el objeto todavía funcionan como de costumbre, ¡SÍ!

Este debe ser un ArgumentException.

.Net se tiro de un Sistema.ArgumentException si intenta agregar un elemento a una tabla hash dos veces con el mismo valor de la clave, de modo que no parezca hay algo más específico.Usted puede escribir su propio excepción si necesitas algo más específico.

Probablemente, usted debe tirar ArgumentException, como que es lo que la base de la biblioteca de clases de.

Bien, si usted realmente desea una colección con elementos únicos, es posible que desee echar un vistazo a la HashSet objeto (disponible en C# 3.0).

De lo contrario, hay dos enfoques que puede tomar:

  • Crear una excepción personalizada para su funcionamiento, tal como se había indicado
  • Implementar un método Add() que devuelve un resultado booleano:true si el elemento es agregado y false si el elemento ya tiene un duplicado de la colección

Cualquier enfoque puede ser considerado como la mejor práctica, sólo es consistente en su uso.

Siempre me gustó la excepción InvalidOperationException.Sin embargo, también podría crear una excepción personalizada, dicen que un DuplicateSoftwareAssignmentException.


Desde el marco de las directrices de diseño:

"Lanzar una excepción ArgumentException o crear una excepción derivada de esta clase si los parámetros no válidos se pasan o detectado.

Lanzar la excepción InvalidOperationException excepción si una llamada a un conjunto de propiedades descriptor de acceso o método no es apropiado dado que el objeto del estado actual."

El estado actual incluye referencias a otras instancias de la clase.En este caso, el estado ya incluye una referencia a la instancia que se está añadiendo, así, la llamada al método es inadecuado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top