Как перехватить множество исключений в деструкторах при наследовании?

#include <iostream>
#include <stdexcept>

class A
{
public:
    A()
    {
        std::cout << "A" << std::endl;
        fake();
    }

    virtual ~A()
    {
        throw std::runtime_error("Test ex in ~A()");
        std::cout << "~A" << std::endl;
    }

    void fake()
    {
        d();
    }

    virtual void d()
    {
        std::cout << "A::d()" << std::endl;
    }
};

class B : public A
{
public:
    B()
    {
        std::cout << "B" << std::endl;
        fake();
    }

    ~B()
    {
        std::cout << "~B" << std::endl;
    }

    virtual void d()
    {
        std::cout << "B::d()" << std::endl;
    }
};

class C : public B
{
public:
    C()
    {
        std::cout << "C" << std::endl;
        fake();
    }

    ~C()
    {
        throw std::runtime_error("Test ex in ~C()");
        std::cout << "~C" << std::endl;
    }

    virtual void d()
    {
        std::cout << "C::d()" << std::endl;
    }
};

int main( int argc, char *argv[] )
{
    try {
        {
            C object;
        }
    }
    catch (const std::exception& e) {
        std::cout << "catch: " << e.what() << std::endl;
    }

    return 0;
}


На выходе получаю:
Запускается /home/evgeny/develop/build-testcpp-Desktop_Qt_5_2_1_GCC_64bit-Debug/testcpp...
A
A::d()
B
B::d()
C
C::d()
~B
terminate called after throwing an instance of 'std::runtime_error'
what(): Test ex in ~A()
Программа неожиданно завершилась.
/home/evgeny/develop/build-testcpp-Desktop_Qt_5_2_1_GCC_64bit-Debug/testcpp завершился крахом

Как перехватить все исключения?
  • Вопрос задан
  • 2539 просмотров
Решения вопроса 1
@Lol4t0
А потому что не надо выпускать исключения из деструктора - необходимо все их там же и ловить.

В частности, в вашем случае - если исключение будет брошено из деструктора в процессе обработки другого исключения, приложение завершится.

stackoverflow.com/questions/130117/throwing-except...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@xandox
Ну для начала: вызывать виртуальные функции в конструкторе базового класса - так же плохо как и есть детей. Не обрабатывать возможные исключения в деструкторе - еще хуже.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы