¿Es posible manejar excepciones en estos escenarios:El manejo de excepciones antes y después de la principal
- lanzados desde el constructor antes de entrar en main()
- lanzada desde destructor después de salir principal()
¿Es posible manejar excepciones en estos escenarios:El manejo de excepciones antes y después de la principal
El divertida característica menos conocida de cómo integrar de try-catch en un constructor:
object::object(int param)
try
: optional(initialization)
{
// ...
}
catch(...)
{
// ...
}
Sí, esto es C++ válida. El beneficio adicional de esto es el hecho de que la prueba se pondrá al día excepciones lanzada por los constructores de los miembros de datos de la clase, incluso si no se mencionan en el inicializador ctor o no exista un inicializador ctor:
struct Throws {
int answer;
Throws() : answer(((throw std::runtime_error("whoosh!")), 42)) {}
};
struct Contains {
Throws baseball;
Contains() try {} catch (std::exception& e) { std::cerr << e.what() << '\n'; }
};
2:30 am ¡y ya aprendí algo hoy! – Potatoswatter
+1 No sabía que era válido C++. Aprendí algo hoy. – Tarydon
Me sorprendí cuando lo aprendí también :). Es una de esas características menos conocidas ... –
Es posible establecer un manejador de excepciones antes de la construcción/destrucción de los objetos en cuestión, que uno debería ser capaz de manejar esas excepciones.
Para los constructores, existe una nueva sintaxis extraña que permite atrapar excepciones dentro del constructor. No estoy seguro de cómo funciona eso, y no se implementa comúnmente en muchos compiladores.
Para los destructores, debe envolver el contenido del destructor de una manera {code(); } catch (...) {} bloque. Que puede no ser siempre el comportamiento deseado, dependiendo de lo que quiere lograr en ese destructor.
"Nuevo" como en más de 15 años de edad? : P It * es * comúnmente implementado y es parte del estándar C++. –
Sí: no utilice objetos peligrosos a nivel mundial!
Esta es la mejor respuesta (después de agregar "o singleton peligrosos"), ¡pero estoy fuera de votos durante las próximas 14 horas! –
+1: en nombre de Roger; sin embargo, me gustaría señalar que hay situaciones en las que esto es imposible, especialmente si utiliza alguna API extraña que toma la decisión por usted. –
Estoy contento de no obtener downvoted - LOL – Potatoswatter
Respuesta corta: no.
Cualquier objeto global que arroje una excepción en su constructor causará una excepción no controlada (es decir, se llamará a terminate
).
Cualquier clase que arroje una excepción en su destructor es una clase rota.
Usar el patrón de singleton en lugar de globales le dará más opciones.
Encuentro lo contrario: los singleton reducen las opciones. Sin embargo, poner objetos a nivel de aplicación como variables locales en la obra principal funciona maravillosamente. –
@Roger No creo que estemos de acuerdo, solo dije que los singleton te dan más opciones que los globales. –
No, creo que los singleton reducen las opciones en comparación con los objetos globales, ya que al menos con globales puede ponerlos todos en una TU para controlar el orden de inicialización, y otros. –
Por lo tanto, basándonos en todas las sugerencias, es seguro concluir que: (1) Incluso con el bloque try-catch alrededor del constructor/destructor, la excepción se volverá a ejecutar. (2) Si esto ocurre fuera del ámbito main(), es decir, la inicialización del objeto global o la autoinicialización del objeto normal durante la terminación, la excepción no se puede capturar. – shiouming
No del todo. Los Ctors solo * pueden * indicar fallas a través de excepciones, ya que no puede tener un finalizador sin construir un objeto; así que atrapar excepciones lanzadas por un ctor no debe violar eso. Usted * debe * atrapar cualquier excepción potencial de un dtor, porque los dtors se llaman como parte del desenrollado de la pila (lo que sucede cuando se lanzan excepciones). Si no lo hace, entonces tiene * dos * excepciones activas al mismo tiempo, lo que le permite a std :: terminar(). –
Estoy leyendo este tema del título de Stroustrup.De su explicación, todo suena como diseño doloroso sujeto a mí. – shiouming