Вопрос не в том, безопасно ли создавать исключение из деструктора.
http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.9 состояния:
"Во время разматывания стека все локальные объекты во всех этих фреймах стека разрушаются. Если один из этих деструкторов выдает исключение (скажем, выбрасывает объект Bar), система времени выполнения C ++ находится в безвыходной ситуации: он игнорирует Bar и в конечном итоге в} catch (Foo e) {куда он изначально направлялся? Должен ли он игнорировать Foo и искать} catch (Bar e) {handler? Нет хорошего ответа - любой выбор теряет информацию . "
IE: если во время разматывания стека выдается другое исключение, то система времени выполнения находится в безвыходной ситуации, потому что обработчик перехвата 'искать' неоднозначен.
Есть ли «исключение» из вышеприведенного, когда исключение, которое выдается во время разматывания стека, находится в блоке try / catch? В этом случае нет никакой двусмысленности:
#include <iostream>
using namespace std;
class Component
{
public:
~Component()
{
cout << "In component destructor" << endl;
try
{
throw 1;
}
catch (...)
{
cout << "Caught exception in component destructor" << endl;
}
}
};
class Container
{
public:
~Container()
{
cout << "In container destructor" << endl;
Component component;
}
}
;
int main()
{
try
{
Container cont;
throw 'a';
}
catch (...)
{
cout << "Caught main exception ok" << endl;
}
return 0;
}
Следующее подразумевает это, но мне было интересно, знает ли кто-нибудь о соответствующих стандартных разделах C ++.
http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr155.htm
"Если при размотке стека деструктор выдает исключение, и это исключение не обрабатывается, вызывается функция terminate (). Следующий пример демонстрирует это:"