Pregunta

Consideramos que puede suceder una excepción en la inicialización.Así que escribimos el bloque de intento / captura.

int f(){
    throw 1;
}

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

private:
    int _k;
};

Pero la excepción de la captura de Rethrows en un nivel más profundo.Eso significa que el siguiente código

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

saldrá:

Exception 1
Exception 2

¿Por qué este trato / bloque de captura no se comporta de la misma manera que el bloqueo de intento / captura ordinario?

Ejemplo de código completo: http://ideone.com/xjy2d

¿Fue útil?

Solución

Parece que su pregunta es: ¿por qué un nivel de función intenta / captura automáticamente reconstruir la excepción?Con la obtención de una excepción desde la construcción de un objeto, este objeto se considera muerto antes de que se trate de la 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 tiraría, obtendrías un casco de un objeto en tus manos.Esto claramente no es deseable.

Otros consejos

El objeto que está construyendo no se ha construido realmente, por lo que la simple respuesta no es una opción.Este tipo de atrapado siempre reconstruye (a menos que arroje su propia excepción de la cláusula de captura).

Porque no es un bloque de prueba ordinario, sino un intento / captura de nivel de función.Se reconstruye automáticamente a menos que lo haga explícitamente utilizando throw.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top