2010-04-15 22 views
8

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++?

+2

Err .. ¿Qué es VERIFY()? No está en la biblioteca estándar de C++ ... ¿te refieres a una afirmación afirmativa? –

+0

Parece ser MFC-relacionado: http://msdn.microsoft.com/en-us/library/fcatwy09(VS.71).aspx – Amber

+1

Me pregunto por qué la biblioteca estándar ha valer(), pero no verificar() – Inverse

Respuesta

18

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.

5

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).

+1

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

+0

¡Su opinión sobre las comprobaciones del modo de depuración en modo de lanzamiento también está bien soportada! – Cameron

6

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ó.

+0

Buen punto, +1 ... – sevaxx

+3

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

Cuestiones relacionadas