2009-11-10 9 views

Respuesta

13

Si está buscando un valor que debe, por definición, corresponde al valor de una enumeración, y ha recibido algo más, definitivamente es un argumento no válido.

Pero ahora debes considerar el contexto.

¿El método es privado y solo es accesible para los miembros de la biblioteca o aplicación de la clase? Si es así, es un error de codificación que, para empezar, NUNCA debería ocurrir. Assert y fail.

Si, por otro lado, es un método público o protegido, y puede ser accedido por los clientes que consumen su biblioteca, definitivamente debe lanzar con un mensaje significativo (y preferiblemente un tipo de excepción bien conocido).

Es importante recordar que las enumeraciones no están verificadas en el marco. Puedo especificar que un método requiere un parámetro de tipo Environment.SpecialFolder; pero aceptará cualquier valor entero de 32 bits.

Por lo tanto, en resumen, si su método es para el consumo público, sí, por supuesto, tiro. Si no es para el consumo público, Assert.

+1

+1 dijo bien. Si el valor inesperado proviene del tuyo, afirma y falla. Por otro lado, si proviene de alguien más que usa tu código, entonces deberías lanzar una excepción y darle al código de llamada la oportunidad de recuperarlo. –

+2

¿Por qué es mejor Assert que lanzar? Tal vez esa condición es un caso raro y el desarrollador no lo golpea, y solo recibe el impacto del probador, que utiliza la compilación Release (sin compilación de Assert) y el error se traga. ¿Es mejor tragarse los errores, no bloquearse pero hacer un trabajo de depuración incorrecto, en lugar de bloquearse con un seguimiento de la pila? –

+0

Otra pregunta es cuánto vale la pena poner en el código la comprobación de errores, si no escribes API para otras compañías? El código abreviado es más legible que el código en el que el tamaño de cada método se duplica debido a la comprobación de errores. ¿No es así? –

0

Realmente depende del proceso específico, pero sí, es un buen proceso para responder de manera predeterminada: caso si se supone que algo no debería estar allí.

2

Eso suena como una opción razonable.

Personalmente, crearía un nuevo tipo de excepción (tal vez un InvalidEnumException o le daría otro nombre que tenga sentido para el equipo de soporte) y arrojar eso.

+2

Personalmente, intentaré y volveré a utilizar uno de la miríada de tipos de excepciones existentes. http://blogs.msdn.com/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx – Joe

+0

De acuerdo, downvoted porque no creo que esto sea un caso para un tipo de excepción personalizado. –

1

Yo arrojaría ApplicationException porque si su código llega al valor predeterminado y no lo esperaba, esto significa que algo en su código no se está comportando como pensaba.

+0

¿No se desaprueba el uso de ApplicationException? –

+0

Nunca escuché que –

0

Yo diría que al menos debería poner allí un Debug.Fail().

Debe lanzar una excepción en caso de que el método de ninguna manera pueda continuar. Pero si es como convertir sus valores enum a representaciones de cadena, entonces puede simplemente devolver alguna cadena de advertencia. El producto no se bloqueará en los usuarios debido a un error obvio, probablemente habrá una solución y todos estarán felices.

4

Quizás no NotImplementedException, pero ArgumentException. Realmente dependería de dónde lo estés usando.

1

Realmente depende de su caso de uso. Será útil si lanza una excepción durante los primeros días de la integración. Los usuarios de su biblioteca pueden conocer inmediatamente los errores

0

Si lanzó la excepción ¿qué pasaría? ¿En qué contexto se está ejecutando la instrucción switch? ¿Debería ocurrir esa situación alguna vez? ¿Debería ocurrir alguna vez en tiempo de ejecución en el código de producción? ¿Sus pruebas unitarias cubren esta situación? Si es así, quizás una afirmación sería mejor.

0

Primero debe considerar lo que significaría si obtiene un valor fuera de los casos conocidos: ¿qué representa la variable que se enciende? Entonces, simplemente puede usar un tipo de excepción que se ajuste a lo que realmente está sucediendo.

5

Realmente depende.

  • El NotImplementedException es algo así como todo marca para mí. Significa que alguien vendrá después para terminar el código. Sin embargo, no creo que sea un caso de incumplimiento que no debería suceder.

  • Cuando esté comprobando el estado del objeto, puede considerar InvalidOperationException. Su método está diseñado solo para trabajar con casos existentes.

  • Cuando se discrimina sobre el parámetro de entrada ArgumentException siempre es apropiado.

  • En otros casos prefiero NotSupportedException. Indica levemente que algo está mal con la plataforma o la versión. Y las versiones incompatibles del código son la verdadera raíz del problema cuando ocurre un caso de cambio predeterminado que no debería suceder.

+0

respuesta interesante. ¿Cuál es tu motivación/razonamiento? –

+1

@Tim: actualicé mi respuesta. –

+0

Excelente respuesta, gracias por la actualización. Estoy completamente de acuerdo con usted, ¿cómo lo ha dicho? Eso me ayudó a aclararlo en mi propia cabeza. –

Cuestiones relacionadas