Есть некоторые статьи заключительных «никогда не сгенерирует исключение из деструктора», и «станд :: uncaught_exception() не является полезным», например:права использования станда :: uncaught_exception в деструкторе
- http://www.gotw.ca/gotw/047.htm (автор Herb Sutter)
Но, похоже, я не понимаю. Поэтому я написал небольшой пример тестирования (см. Ниже).
Поскольку все в порядке с примером тестирования, я был бы очень признателен за некоторые комментарии относительно того, что может быть неправильным с ним?
Результаты тестирования:
./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()
Пример:
// 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;
}
ДОБАВЛЕНО : Другими словами: несмотря на предупреждения в некоторых статьях, он работает так, как ожидалось - так что может быть с ним не так?
Что вы хотите сказать? Кажется, вы наблюдаете за ожидаемым поведением механизма, который вы не должны использовать. Рассматриваете ли вы его использование за пределами тестового/экспериментального контекста и почему? – Potatoswatter
@Potatoswatter: вопрос в том, что: 'несмотря на предупреждения в некоторых статьях, он работает так, как ожидалось, - так что может быть не так?' – 2010-03-19 05:40:28
Яркий нарс, но это не цитирует сказанное, и невозможно понять, чего ожидать, подходящим или безопасным в вашем контексте без дополнительной информации. Безопасный маршрут, как скажет вам Герб Саттер и многие другие, заключается не в том, чтобы выбраться из деструктора в первую очередь. – Potatoswatter