2012-08-27 9 views
7

Por Abrahams tenemos 3 tipos de excepciones:garantía excepción fuerte VS garantía excepción básica

  1. nothrow
  2. garantía básica excepción
  3. excepción fuerte garantía

medios básicos (Corrija si estoy equivocado) que los invariantes se conservan, por ejemplo, que las invariantes del componente se conservan, y no se filtran recursos, wh Es fuerte que la operación se haya completado con éxito o haya arrojado una excepción, dejando el programa en estado exactamente como estaba antes de que comenzara la operación.

  1. ¿Qué significa que se conservan invariantes? que si tengo un valor válido en una de mis variables, entonces no tendría (tome por ejemplo un puntero) un NULL?

  2. En referencia a la garantía de excepción fuerte, ¿significa que todas mis variables almacenarían exactamente los mismos valores antes de que se lanzara la excepción?

por ejemplo:

int main() 

{ 
    int j = 1; 
    int *p = &j; 

    // do some stuff 
    j = 2; 
    throw 1; 

} 

Luego, después de lo tiro, j sería mantener el valor 2 o 1?

Saludos

+0

¿Qué referencia estás citando ??? – paulsm4

+0

@ paulsm4: Wikipedia 'http: // en.wikipedia.org/wiki/Exception_guarantees' – ron

+2

Dave Abrahams lo explica con mucho más detalle en: [** Exception-Safety in Generic Components **] (http: // www.boost.org/community/exception_safety.html). El artículo responde su pregunta de forma bastante convincente en la sección: *** Una base contractual para la excepción-seguridad *** –

Respuesta

2

En su caso, no hay excepción de garantía. (Esto es básicamente el caso 0). El artículo de Wikipedia que citó es claro: "Las reglas se aplican a las implementaciones de clase ". Además, después de tirar, la variable j está fuera del alcance y ya no existe. Ya no puede hablar de su dirección, menos aún del valor

Por lo general, las invariantes de clases las define el autor de la clase, por lo que significa lo que signifique el autor de la clase. No entiendo tu punto 1. NULL es un valor válido para un puntero.

Su segundo punto es bueno. La definición no es absoluta. Por ejemplo, una operación en un miembro de datos de cadena puede aumentar su capacidad. Puede observar esto en el exterior a través de const&. Sin embargo, esa capacidad de cadena generalmente no se considera como parte del valor de cadena, y por lo tanto no como parte de la invariante de clase.

6
  1. Garantía básica: después de una excepción, los objetos se mantienen en un estado consistente y utilizable. No se filtran recursos y se conserva invariants. El estado de un objeto puede haber cambiado, pero todavía se puede usar. Por ejemplo, una fecha de objetos cuyo valor day se ha convertido en -1 ya no se puede usar. Sus invariantes dicen que day está en [1; 31].

  2. Garantía fuerte: (adicional a 1.) Un objeto de fecha tiene valor 2012-12-31. Después de que una operación que intenta modificar ese valor ha fallado, el valor de ese objeto sigue siendo 2012-12-31. Tal vez algún estado interno ha cambiado, pero el estado lógico desde la vista del cliente no ha cambiado.

Cuestiones relacionadas