Además, ¿cómo se compara con lanzar una excepción cuando algo va mal?¿VERIFY (...) es una buena práctica en la codificación C++?
Respuesta
VERIFY()
sirve al mismo propósito que ASSERT()
(o la biblioteca estándar assert()
) - para que pueda coger cosas que realmente no debería nunca ™ estar pasando (es decir, un cierto error de código, algo que debe ser fijada antes de la liberación) . El tipo de cosas que si por alguna razón la expresión es falsa, no tiene sentido continuar porque algo es horrible, terriblemente incorrecto.
Esto se refleja en el hecho de que VERIFY()
solo detiene el programa en una evaluación falsa al compilar en el modo de depuración: en el modo de lanzamiento, es transparente. La diferencia entre VERIFY()
y ASSERT()
es que VERIFY()
aún evaluará la expresión en modo Release, simplemente no le importará el resultado - mientras que ASSERT()
se elimina completamente del programa al compilar en modo Release y por lo tanto, cualquier efecto secundario de la expresión dentro de ella no tendrá lugar.
Las excepciones son más útiles para cosas que podrían ir mal, pero se pueden recuperar, ya que las excepciones pueden ser manejadas por otras partes del programa.
En Visual C++, hay dos macros para comprobar las condiciones: ASSERT
y VERIFY
.
En el modo de depuración, ambos se comportan igual: es decir, ambos evalúan su armamento y si el resultado es 0, ambos detienen el programa con un cuadro de diálogo de error de aserción.
La diferencia radica en el modo de lanzamiento. En versión, modo, ASSERT
se elimina por completo del programa: no evalúa su expresión en absoluto. VERIFY
, por otro lado, todavía evalúa la expresión, simplemente ignora el resultado.
Personalmente, mi opinión es que si el control es valioso en el modo de depuración, también es valioso en el modo de lanzamiento y probablemente no deberías usar ninguno de ellos. Simplemente haz la prueba y lanza una excepción (o utiliza una macro personalizada que se expande a assert()
en modo de depuración y una excepción en el modo de lanzamiento).
Una diferencia útil es si tiene pruebas "quisquillosas" que tardan un poco en ejecutarse, puede ponerlas en 'ASSERT()' y luego no preocuparse por las pérdidas de rendimiento en el modo Release. – Amber
¡Su opinión sobre las comprobaciones del modo de depuración en modo de lanzamiento también está bien soportada! – Cameron
La pregunta parece simple, pero oculta un tema enorme: tratar con errores.
Summarilly yo diría afirman y verificar son herramientas a utilizar en proceso Desarrollos mientras excepciones y el sistema de llamadas de comprobación de errores son partes normales del código de producción para hacer frente a los errores de ejecución .
Las afirmaciones (Se aplica a afirmar y verificar) son herramientas que se utilizan en su mayoría en el estilo de programación defensiva. Su principal objetivo es protegerse contra casos que nunca deberían ocurrir y el programador no tiene idea de qué hacer si eso sucede. Usualmente se usa para verificar errores de programación. Cuando sucede lo imposible al depurar un programa, generalmente desea detectarlo e informarlo lo más rápido posible. Simplificará la corrección de errores. Puede usarlo con alguna condición o incluso como
assert(false)
típicamente para verificar que nunca se atrapa una rama de un interruptor.Utilizo sobre todo cuando se trata de afirmaciones código de terceros cuyo comportamiento no estoy seguro. Para verificar el comportamiento de mi propio código de código en desarrollo, generalmente prefiero las pruebas unitarias.
Ahora, como nos enseñó Schroëdinger, las medidas cambian las cosas. Es posible que en algún momento tenga un código que funcione en modo de depuración cuando la opción afirmativa esté habilitada y deje de funcionar en el modo de lanzamiento. Por lo general, es el síntoma de un error oculto dentro de la condición de aserción (efecto secundario, código sensible al tiempo). Verificar minimizar este tipo de riesgo, pero puede considerarse una mala práctica, como barrer el polvo detrás de la alfombra.
También puede usar verificar para una codificación rápida como scafolding para lugares donde aún no configuró un error de manejo real. No creo que debas dejar ninguna verificación en el código de producción.
Excepciones son una parte normal de flujo de control del programa. En la mayoría de los casos se utilizan para tratar los errores, pero no es su único uso posible (aquellos que usan otros lenguajes como Python sabrán de lo que estoy hablando). Tampoco deben considerarse como la única herramienta de gestión de errores. Cuando no está incluido en una biblioteca consciente de C++, las llamadas al sistema aún devuelven un código de error en lugar de generar una excepción.
Como regla excepciones pulgar debe estar comprendida en el objeto más cercano que es capaz de manejar con sensatez.
Además, no todas las excepciones deben considerarse como errores fatales y detener el programa. Imagine que está tratando con una biblioteca de transmisión de video en red que devuelve casos de error a través de excepciones. Si la biblioteca lanza una advertencia de excepción que indica que se ha caído un marco, generalmente no desea detener el programa, sino simplemente prepararlo para el siguiente cuadro.
Incluso cuando lo mejor que puede hacer es dejar el programa que no debe dejar que la excepción que lo haga por usted (y usted tiene incluso menos razones para utilizar valer para tal fin en el código de producción). Siempre debe existir un manejador de excepciones de nivel superior para ese propósito que haga llamadas explícitas a exit() de like. No hacerlo simplemente demuestra que al programador no le importaba lo que podía pasar y probablemente no lo pensó.
Buen punto, +1 ... – sevaxx
Poner en un manejador de excepciones de nivel superior para 'excepciones no detectadas' tiene el inconveniente de que cuando se produce una excepción no detectada, la pila se destruye hasta el manejador de nivel superior; que luego hará algo completamente poco interesante como decir qué excepción ha ocurrido, luego, como dices, sal del programa de todos modos. Dejarlo sin manejar por completo le da al depurador la oportunidad de detener el programa en el estándar con toda la pila de ejecución disponible e inspeccionable. – rvalue
- 1. ¿Es una buena práctica comparar la cadena C# con '=='?
- 2. ¿Es una buena práctica liberar un puntero NULL en C?
- 3. C# - ¿Agregar una interfaz sistemáticamente es una buena práctica?
- 4. ¿Es una buena práctica hacer la optimización durante la codificación inicial?
- 5. ¿Es este patrón de singleton C# modificado una buena práctica?
- 6. ¿Es la buena práctica del subdominio www?
- 7. ¿El espacio de nombres JQuery es una buena práctica?
- 8. ¿Es una buena práctica implementar lógica en las propiedades
- 9. AsyncTask dentro de un método estático - ¿Buena práctica de codificación?
- 10. Java - ¿Es esta una buena práctica de programación?
- 11. ¿Es la inicialización estática una buena práctica de programación?
- 12. ¿Es una buena práctica usar assert en Java?
- 13. Java: ¿es una buena práctica definir beans en XML?
- 14. ¿Es una buena práctica tener consulta de linq en Controladores?
- 15. ¿Es una buena práctica exportar variables en Perl?
- 16. ¿Es una buena práctica usar rawQuery en ContentProvider?
- 17. ¿Es una buena práctica devolver el puntero de la función en c?
- 18. ¿Es esta una buena práctica para una excepción personalizada?
- 19. ¿Es una buena práctica separar el código en bloques?
- 20. ¿Es una buena práctica inicializar una variable a nulo?
- 21. ¿Cuál es la mejor práctica de codificación para las condiciones?
- 22. ¿Es una buena práctica actualizar los paquetes R a menudo?
- 23. ¿Los objetos inmutables son una buena práctica?
- 24. ¿Qué es una buena práctica para construir parches de software?
- 25. ¿es una buena práctica usar iframe para implementar header/navbar?
- 26. ¿Es una buena práctica escribir métodos que devuelvan el vacío?
- 27. ¿Es una buena práctica usar pluralidad para nombrar colecciones?
- 28. ¿Es una buena práctica proteger las variables miembro?
- 29. llamadas asincrónicas dentro de obtener acceso - ¿es una buena práctica?
- 30. Delphi - FieldByName.AsString - buena práctica
Err .. ¿Qué es VERIFY()? No está en la biblioteca estándar de C++ ... ¿te refieres a una afirmación afirmativa? –
Parece ser MFC-relacionado: http://msdn.microsoft.com/en-us/library/fcatwy09(VS.71).aspx – Amber
Me pregunto por qué la biblioteca estándar ha valer(), pero no verificar() – Inverse