tipos - try catch c++
Constructor como un bloque try de la función-La excepción anula el programa (4)
Este es un comportamiento normal de acuerdo con la documentación de cppreference.com para los bloques de función : una llamada función-prueba-bloqueo en un constructor o destructor debe lanzar desde su cláusula de captura o bien hay un nuevo lanzamiento implícito después de la cláusula de captura .
Esto tiene perfecto sentido: el objeto A
no se ha construido correctamente y, por lo tanto, no está en condiciones de uso: debe arrojar una excepción. Debe asegurarse de que la construcción tenga éxito en el lugar donde está construido el objeto, es decir, en el caso de su ejemplo en main()
.
No estoy seguro de si esto es un problema con el compilador o si estoy haciendo algo mal. Estoy usando el compilador de Visual Studio 2013.
Tengo una clase en la que necesito adquirir una cantidad significativa de recursos en mi lista de inicializadores de constructores, la mayoría de los cuales pueden arrojar una excepción. Envolví la lista de inicializadores de miembros en un bloque de prueba de función y atrapé la excepción allí. Pero mi programa aún aborta a pesar de que la cláusula catch no vuelve a arrojar la excepción. No puedo publicar el código real. Así que he reproducido el problema con este código de demostración equivalente. ¿Alguien puede ayudarme a resolver esto?
#include <iostream>
using namespace std;
class A{
public:
A() try : i{ 0 }{ throw 5; }
catch (...){ cout << "Exception" << endl; }
private:
int i;
};
int main(){
A obj;
}
Al ejecutar este código, recibo una alerta de Windows "cancel () ha sido llamado". Así que supongo que el sistema está tratando esto como una excepción no detectada y llamando a terminate ().
Por otro lado, si envuelvo la construcción del objeto en main () en un bloque try-catch, la excepción se detecta correctamente y el programa finaliza normalmente.
¿Puede alguien decirme por favor si estoy haciendo algo mal aquí?
Hay un boom relevante
Básicamente, incluso si no arrojas tu bloque catch, la excepción se volverá a lanzar automáticamente
Si el cuerpo del manejador contenía la instrucción "throw"; entonces el bloque catch obviamente volvería a lanzar cualquier excepción que hayan emitido A :: A () o B :: B (). Lo que es menos obvio, pero está claramente establecido en el estándar, es que si el bloque de captura no arroja (vuelva a lanzar la excepción original o arroje algo nuevo) y el control llega al final del bloque catch de un constructor o destructor, entonces la excepción original se vuelve a lanzar automáticamente.
La excepción no puede capturarse en la function-try-block
constructor function-try-block
.
n3376 15.2 / 15
La excepción manejada actualmente se reinicia si el control llega al final de un controlador de la función-try-block de un constructor o destructor.
Debes atraparlo en el lugar de creación de objetos.
Le sugiero que lea el artículo: "Fallas del constructor GotW # 66" en el sitio: http://gotw.ca/gotw/066.htm