Acabo de comenzar a rozar 'Debugging MS .Net 2.0 Applications' por John Robbins, y me he confundido por su evangelismo para Debug.Assert (...).Debug.Assert frente a excepciones arrojadas específicas
Señala que bien implementado Afirma almacenar el estado, en cierta medida, de una condición de error, por ejemplo:
Debug.Assert(i > 3, "i > 3", "This means I got a bad parameter");
Ahora, personalmente, me parece una locura para mí, que él quiere reafirmar su prueba sin una comentario real de 'lógica de negocios' razonable, tal vez "i < = 3 nunca debe suceder debido al proceso de modificación de flobittyjam".
Entonces, creo que aparece Asserts como una clase de bajo nivel de "Vamos a proteger mis suposiciones" ... suponiendo que uno siente que esta es una prueba que solo se necesita hacer en la depuración, es decir, protegiéndose contra colegas y futuros programadores, y esperando que realmente prueben cosas.
Pero lo que no entiendo es que luego agrega que debe usar aserciones además del manejo normal de errores; ahora lo que preveo es algo como esto:
Debug.Assert(i > 3, "i must be greater than 3 because of the flibbity widgit status");
if (i <= 3)
{
throw new ArgumentOutOfRangeException("i", "i must be > 3 because... i=" + i.ToString());
}
¿Qué he ganado por la repetición de la prueba Debug.Assert condición de error? Creo que lo conseguiría si estábamos hablando de depuración de sólo doble control de un cálculo muy importante ...
double interestAmount = loan.GetInterest();
Debug.Assert(debugInterestDoubleCheck(loan) == interestAmount, "Mismatch on interest calc");
... pero yo no lo entiendo para las pruebas de parámetros que son sin duda vale la pena comprobación (tanto en DEPURACIÓN como en compilaciones de versión) ... o no. ¿Qué me estoy perdiendo?
Las afirmaciones pueden ser utilizados para la comprobación de parámetros de * interno * llamadas de método (llamado por código que pertenece a la misma componente) métodos, en oposición a las llamadas a métodos externos (llamados por otro componente) . Por ejemplo, podría afirmar que un parámetro de método privado de tipo Double no es un NaN. – RoadWarrior
@Chris: Usted declara que las Afirmaciones no deben usarse para la verificación de parámetros. ¿Hay alguna razón para esto? Tiendo a lanzar excepciones para verificaciones de parámetros especialmente en constructores cuando inyecto objetos dependientes. Sin embargo, me están diciendo que use Afirmaciones. No tengo una explicación lógica para usar excepciones en lugar de aserciones. ¿Eres capaz de aclarar? Cheers –
No se preocupe, descubrí por qué. De acuerdo con Jon Skeet, http://stackoverflow.com/questions/1276308/exception-vs-assertion: "Use las aserciones para las verificaciones lógicas internas dentro de su código, y las excepciones normales para las condiciones de error fuera del control de su código inmediato". –