C ++ выбрасывает исключение из деструктора - PullRequest
3 голосов
/ 27 апреля 2011

Вопрос не в том, безопасно ли создавать исключение из деструктора.

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 (). Следующий пример демонстрирует это:"

1 Ответ

7 голосов
/ 27 апреля 2011

Ваш деструктор компонентов в безопасности.Правило, которое вы цитируете, применяется только в том случае, если исключение выбрасывается из деструктора (т. Е. Для вызывающего деструктора).

EDIT : Вот одна соответствующая цитата из стандарта (выделение добавлено)

Примечание. Если деструктор, вызываемый при разматывании стека , выходит из с исключением, вызывается std :: terminate (15.5.1).

...