tipos textos texto tesis que estructura ejemplos conclusion argumentos argumento argumentativos argumentativo argumentativas argumentacion c# generics exception

c# - tesis - textos argumentativos ejemplos



La mejor excepción para un argumento de tipo genérico no válido (11)

¿Qué hay de heredar de NotSupportedException. Si bien estoy de acuerdo con @Mehrdad en que tiene más sentido, escucho su punto de que no parece encajar a la perfección. Así que hereda de NotSupportedException, y de esa manera las personas que codifican contra tu API aún pueden atrapar una NotSupportedException.

Actualmente estoy escribiendo un código para UnconstrainedMelody que tiene métodos genéricos para hacer con enumeraciones.

Ahora, tengo una clase estática con un montón de métodos que solo deben usarse con enumeraciones "flags". No puedo agregar esto como una restricción ... así que es posible que también se les llame con otros tipos de enumeración. En ese caso, me gustaría lanzar una excepción, pero no estoy seguro de cuál lanzar.

Solo para hacer esto concreto, si tengo algo como esto:

// Returns a value with all bits set by any values public static T GetBitMask<T>() where T : struct, IEnumConstraint { if (!IsFlags<T>()) // This method doesn''t throw { throw new ??? } // Normal work here }

¿Cuál es la mejor excepción para tirar? ArgumentException suena lógico, pero es un argumento de tipo en lugar de un argumento normal, lo que podría confundir fácilmente las cosas. ¿Debo presentar mi propia clase TypeArgumentException ? Use InvalidOperationException ? NotSupportedException ? ¿Algo más?

Prefiero no crear mi propia excepción para esto a menos que sea claramente lo correcto.


Aparentemente, Microsoft usa ArgumentException para eso, como se demuestra en el ejemplo de Expression.Lambda<> , Enum.TryParse<> o Marshal.GetDelegateForFunctionPointer<> en la sección de Excepciones. No pude encontrar ningún ejemplo que indique lo contrario (a pesar de buscar el origen de referencia local para TDelegate y TEnum ).

Por lo tanto, creo que es seguro suponer que al menos en el código de Microsoft es una práctica común usar ArgumentException para argumentos de tipo genérico no válidos aparte de los de variables básicas. Dado que la descripción de la excepción en docs no discrimina entre ellos, tampoco es demasiado exagerado.

Con suerte, decide la pregunta de una vez por todas.



Id ir con NotSupportedExpcetion.


Iría con NotSupportedException . Aunque ArgumentException ve bien, en realidad se espera cuando un argumento pasado a un método es inaceptable. Un argumento de tipo es una característica que define el método real que desea llamar, no un "argumento" real. InvalidOperationException debe lanzarse cuando la operación que está realizando puede ser válida en algunos casos, pero para la situación particular, es inaceptable.

NotSupportedException se NotSupportedException cuando una operación no está soportada de forma inherente. Por ejemplo, cuando se implementa una interfaz donde un miembro en particular no tiene sentido para una clase. Esto parece una situación similar.


La programación genérica no debe lanzarse en tiempo de ejecución para parámetros de tipo no válido. No debería compilarse, debería tener una aplicación en tiempo de compilación. No sé qué IsFlag<T>() , pero quizás pueda convertir esto en una aplicación en tiempo de compilación, como intentar crear un tipo que solo sea posible crear con ''flags''. Tal vez una clase de traits puede ayudar.

Actualizar

Si debe lanzar, votaría por InvalidOperationException. El razonamiento es que los tipos genéricos tienen parámetros y los errores relacionados con los parámetros (método) se centran en la jerarquía ArgumentException. Sin embargo, la recommendation sobre ArgumentException establece que

si la falla no involucra los argumentos en sí, entonces se debe usar InvalidOperationException.

Existe al menos un acto de fe, que las recomendaciones de parámetros de métodos también se deben aplicar a parámetros genéricos , pero no hay nada mejor en la jerarquía SystemException imho.


Siempre se debe hacer una excepción personalizada en cualquier caso donde sea cuestionable. Una excepción personalizada siempre funcionará, independientemente de las necesidades de los usuarios de la API. El desarrollador podría detectar cualquier tipo de excepción si no le importa, pero si el desarrollador necesita un manejo especial, será SOL.


Siempre tengo cuidado de escribir excepciones personalizadas, simplemente porque no siempre están documentadas con claridad y causan confusión si no se nombran correctamente.

En este caso, lanzaría una ArgumentException para la falla de verificación de banderas. Todo depende de la preferencia en realidad. Algunos estándares de codificación que he visto van tan lejos como para definir qué tipos de excepciones deberían arrojarse en escenarios como este.

Si el usuario intentaba pasar algo que no era una enumeración, arrojaría una InvalidOperationException.

Editar:

Los otros plantean un punto interesante que esto no es compatible. Mi única preocupación con una NotSupportedException es que, en general, esas son las excepciones que se lanzan cuando se introdujo la "materia oscura" en el sistema, o para decirlo de otra manera, "Este método debe ingresar al sistema en esta interfaz, pero ganamos lo enciende hasta la versión 2.4 "

También he visto NotSupportedExceptions arrojarse como una excepción de licencia "está ejecutando la versión gratuita de este software, esta función no es compatible".

Editar 2:

Otra posible:

System.ComponentModel.InvalidEnumArgumentException

La excepción lanzada al usar argumentos inválidos que son enumeradores.



Yo usaría NotSupportedException ya que eso es lo que estás diciendo. No se admiten otras enumeraciones aparte de las específicas. Esto, por supuesto, se establecería más claramente en el mensaje de excepción.


NotSupportedException suena como si simplemente encaja, pero la documentación establece claramente que debe usarse con un propósito diferente. De las observaciones de la clase MSDN:

Hay métodos que no se admiten en la clase base, con la expectativa de que estos métodos se implementen en las clases derivadas. La clase derivada podría implementar solo un subconjunto de los métodos de la clase base y lanzar NotSupportedException para los métodos no compatibles.

Por supuesto, hay una manera en que NotSupportedException es obviamente lo suficientemente buena, especialmente dado su significado de sentido común. Habiendo dicho eso, no estoy seguro de si es lo correcto.

Dado el propósito de UnconstrainedMelody ...

Hay varias cosas útiles que se pueden hacer con métodos / clases genéricos donde hay una restricción de tipo "T: enum" o "T: delegate", pero desafortunadamente, están prohibidos en C #.

Esta biblioteca de utilidades funciona alrededor de las prohibiciones usando ildasm / ilasm ...

... parece que una nueva Exception podría estar en orden a pesar de la gran carga de la prueba que justamente tenemos que cumplir antes de crear Exceptions personalizadas. Algo como InvalidTypeParameterException puede ser útil en toda la biblioteca (o tal vez no; este es seguramente un caso extremo, ¿no?).

¿Los clientes necesitarán poder distinguir esto de las Excepciones BCL? ¿Cuándo podría un cliente llamar esto accidentalmente usando una enum vainilla? ¿Cómo respondería a las preguntas planteadas por la respuesta aceptada? ¿Qué factores deberían tenerse en cuenta al escribir una clase de excepción personalizada?