2009-08-10 20 views
8

En Java, ocasionalmente lanzaré un AssertionError directamente, para afirmar que no se alcanzará una línea en particular. Un ejemplo de esto sería afirmar que el caso default en una declaración switch no se puede alcanzar (para obtener un ejemplo, consulte this JavaSpecialists page)..Net equivalente al AssertionError de Java

Me gustaría utilizar un mecanismo similar en .Net. ¿Hay alguna excepción equivalente que pueda usar? ¿O hay otro método que podría usarse con el mismo efecto?

Editar - Para aclarar, estoy buscando un mecanismo para fallos de bandera en tiempo de ejecución, en el código publicado, para indicar que se ha producido un fallo (posiblemente catastrófico) de algunas invariantes en el código. El ejemplo vinculado genera un número entero aleatorio entre 0 y 2 (inclusive) y afirma que el número generado siempre es 0, 1 o 2. Si esta afirmación no se cumple, sería mejor detener la ejecución por completo en lugar de continuar con un desconocido estado corrupto del sistema.

Respuesta

8

Normalmente arrojaría InvalidOperationException o ArgumentOutOfRangeException dependiendo de dónde provenía el valor.

Como alternativa, hay Debug.Assert (que sólo se producirá un error cuando se tiene el símbolo DEBUG preprocesador definido) o en .NET 4.0 se puede utilizar Contract.Fail, Contract.Assert o Contract.Assume dependiendo de la situación. Lanzar explícitamente una excepción tiene el beneficio de que el compilador sabe que la siguiente declaración no es accesible.

No soy un gran admirador de Debug.Assert - por lo general no es apropiado para una versión (ya que arroja una caja de afirmación en lugar de simplemente fallar) y de manera predeterminada no se activará de ninguna manera. Prefiero las excepciones que siempre se arrojan, ya que impiden que su código continúe independientemente de la oportunidad de detectar que "algo está mal".

Code Contracts cambia el juego un poco, ya que hay todo tipo de opciones para lo que se conserva en tiempo de ejecución, y el verificador estático puede ayudar a demostrar que no entrarás en ese estado. Todavía es necesario elegir la póliza tiempo de ejecución, aunque ...

1

Usted puede utilizar el método Trace.Assert, que trabajará en las versiones de lanzamiento (si tiene el símbolo TRACE compilación definido, que se define de forma predeterminada en proyectos de Visual Studio) . También puede personalizar la forma en que su aplicación reacciona ante los errores de aserción a través de un TraceListener. El valor predeterminado es (como era de esperar) el DefaultTraceListener, que mostrará la afirmación en un cuadro de diálogo si la aplicación se está ejecutando en modo interactivo. Si desea lanzar una excepción, por ejemplo, puede crear su propio TraceListener y arrojarlo sobre el método Fail. A continuación, puede eliminar el DefaultTraceListener y usar el suyo, ya sea programmatically o en el configuration file.

Esto parece un montón de problemas, y solo es justificable si desea cambiar dinámicamente la forma en que su aplicación maneja las afirmaciones a través de los detectores de seguimiento. Para las violaciones que siempre desea fallar, cree su propia clase AssertionException y tírela de inmediato.

Para .NET 4.0, definitivamente vería el método Contract.Assert. Sin embargo, este método solo se compila cuando se definen los símbolos DEBUG o CONTRACTS_FULL. DEBUG no funcionará en las compilaciones de lanzamiento, y CONTRACTS_FULL también activará todas las demás contrataciones de contratos, algunas de las cuales es posible que no desee que estén presentes en las compilaciones de lanzamiento.

Cuestiones relacionadas