12

Consideramos que puede producirse una excepción en la inicialización. Así que escribimos try/catch block.¿Cómo funciona el try/catch en la lista de inicialización?

int f(){ 
    throw 1; 
} 

class A 
{ 
public: 
    A() try : _k(f()) 
    {} 
    catch (int) 
    { 
     std::cout << "Exception 1" << std::endl; 
    } 

private: 
    int _k; 
}; 

Pero la captura vuelve a lanzar la excepción en un nivel más profundo. Eso significa que el próximo código

try 
{ 
    A a; 
} catch(int) 
{ 
    std::cout << "Exception 2" << std::endl; 
} 

la Salida:

Exception 1 
Exception 2 

¿Por qué este bloque try/catch no se comporta de la misma manera que ordinaria bloque try/catch?

ejemplo de código completo: http://ideone.com/XjY2d

Respuesta

16

Parece que su pregunta es: ¿Por qué una prueba/captura a nivel de función vuelve a lanzar automáticamente la exclusión? Al arrojar una excepción desde la construcción de un objeto, este objeto se considera muerto antes de que cobre vida. Todos sus subobjetos son destruidos. Es decir, si se lanza una excepción durante la construcción, no hay ningún objeto. Si la excepción no arroja, obtendrías un casco de un objeto en tus manos. Esto claramente no es deseable.

+1

Como nota: solo se vuelve a lanzar automáticamente si no te arrojas para salir del bloque 'catch'. –

2

El objeto que se está construyendo en realidad no se ha construido, el regreso tan simple no es una opción. Este tipo de try0-catch siempre vuelve a surgir (a menos que arrojes tu propia excepción de la cláusula catch).

2

Porque no es un bloque try-catch ordinario sino un try/catch a nivel de función. Reanuda automáticamente a menos que lo haga explícitamente usando throw.

+0

Sé que esto no es un bloque ordinario. Pero me gustaría saber cómo se decidió trabajar de esa manera. – Seagull

+0

A continuación, puede aclarar el texto en negrita en la pregunta. Como otros señalaron, la idea principal es que, considerando la persona que llama, el objeto no pudo construir. La única forma de notificar un error durante la construcción es por excepción. – Xyand

Cuestiones relacionadas