Hay algunos artículos finales "Nunca lanzar una excepción desde un destructor", y "std :: uncaught_exception() no es útil", por ejemplo:derecho de uso de std :: uncaught_exception en un destructor
- http://www.gotw.ca/gotw/047.htm (escrito por Herb Sutter)
Pero parece que no entiendo el punto. Así que escribí un pequeño ejemplo de prueba (ver abajo).
ya que todo está bien con el ejemplo de pruebas Me gustaría muy apreciar algunos comentarios con respecto a lo que podría estar mal con él?
resultados de las pruebas:
./main
Foo::~Foo(): caught exception - but have pending exception - ignoring int main(int, char**): caught exception: from int Foo::bar(int)
./main 1
Foo::~Foo(): caught exception - but *no* exception is pending - rethrowing int main(int, char**): caught exception: from Foo::~Foo()
ejemplo:
// file main.cpp
// build with e.g. "make main"
// tested successfully on Ubuntu-Karmic with g++ v4.4.1
#include <iostream>
class Foo {
public:
int bar(int i) {
if (0 == i)
throw(std::string("from ") + __PRETTY_FUNCTION__);
else
return i+1;
}
~Foo() {
bool exc_pending=std::uncaught_exception();
try {
bar(0);
} catch (const std::string &e) {
// ensure that no new exception has been created in the meantime
if (std::uncaught_exception()) exc_pending = true;
if (exc_pending) {
std::cerr << __PRETTY_FUNCTION__
<< ": caught exception - but have pending exception - ignoring"
<< std::endl;
} else {
std::cerr << __PRETTY_FUNCTION__
<< ": caught exception - but *no* exception is pending - rethrowing"
<< std::endl;
throw(std::string("from ") + __PRETTY_FUNCTION__);
}
}
}
};
int main(int argc, char** argv) {
try {
Foo f;
// will throw an exception in Foo::bar() if no arguments given. Otherwise
// an exception from Foo::~Foo() is thrown.
f.bar(argc-1);
} catch (const std::string &e) {
std::cerr << __PRETTY_FUNCTION__ << ": caught exception: " << e << std::endl;
}
return 0;
}
AÑADIDO : En otras palabras: a pesar de las advertencias en algunos artículos, funciona como se esperaba, entonces, ¿qué podría estar mal con eso?
¿Cuál es tu pregunta? Parece que estás observando el comportamiento esperado de un mecanismo que no debes usar. ¿Estás considerando usarlo fuera de un contexto de prueba/experimentación, y por qué? – Potatoswatter
@Potatoswatter: la pregunta es: 'a pesar de las advertencias de algunos artículos que funciona como se espera - ¿y qué podría estar mal con él' –
nuff Feria, pero eso no es citar lo que ha dicho, y es imposible saber lo que se espera,? apropiado o seguro en su contexto sin más información. La ruta segura, como Herb Sutter y muchos otros te dirán, es no tirar desde un destructor en primer lugar. – Potatoswatter