2010-10-28 10 views
5

Vamos a considerar tengo la siguiente función:y excepciones

SomeType createSomeType(); 

que puede throw dependiendo de algunas razones.

continuación:

SomeType val = SomeType(); // initial value 

try 
{ 
    val = createSomeType(); // here 
} 
catch (std::exception&) 
{ 
} 

Si createSomeType() tiros, puedo suponer que siempre val valor es sin cambios?

Respuesta

7

Sí, si createSomeType() arroja una excepción, la asignación no se realizará. El flujo de control irá desde la instrucción throw, a través de los destructores de cualquier objeto que createSomeType() tenga en la pila y finalmente a la instrucción catch.

1

Si el operador de asignación para SomeType es a prueba de excepciones, entonces puede estar seguro de que a val se le asignará un nuevo valor constante o su valor inicial permanecerá sin cambios.

Sin embargo, la excepción puede ser lanzada por createSomeType() o por la asignación después de que createSomeType() se ejecute correctamente. Si el operador de asignación para SomeType está sobrecargado y puede arrojar excepciones, podría ocurrir que val termine en un estado incoherente "medio asignado". Este último es el resultado de no adoptar la excepción de seguridad en el diseño SomeType, que es malo, pero aún puede suceder.

+4

Si 'lanza createSomeType', nunca se entró en el cuerpo del operador de asignación? ¿Cómo podría cambiar el valor en ese caso? –

+0

@ Space_C0wb0y: Puede suceder que el cuerpo no arroje, pero arroja la asignación sobrecargada. – sharptooth

+1

El OP explícitamente pregunta por el caso cuando 'createSomeType' lanza, por lo que el operador de asignación no desempeña un papel (en ese escenario específico). –

0

a partir de documentos estándar 15.2.1,

medida que pasa el control a partir de un saque de banda expresión a un controlador, destructores se invocan para todos los objetos automáticos construidos desde que se entró en el bloque try. Los objetos automáticos se destruyen en el orden inverso al final de su construcción .

De ahí el valor val, no va a cambiar ...