Исключения в деструкторе

      Комментарии к записи Исключения в деструкторе отключены

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 2 мес., 2 нед. назад.

  • Автор
    Сообщения
  • #3633

    Почему деструкторы не должны генерировать исключения? Обсудим одну из причин (некоторые другие особенности исключений описаны в другой статье). Взгляните на этот код:

    #include <exception>
    
    class test
    {
    public:
    
        test()
        {
    
        }
    
        ~test()
        {
            throw std::runtime_error("Game over!");
        }
    };
    
    int main()
    {
        try
        {
            test t;
    
            throw std::runtime_error("Error!");
        }
        catch(std::exception const&)
        {
    
        }
    
        return 0;
    }

    Когда исключение покидает блок, все локальные объекты, созданные в этом блоке, уничтожаются. Если деструктор объекта, уничтожаемого во время развертки стека, генерирует исключение, то программа будет завершена досрочно, и ее уже ничего не спасет.

    Стандартная библиотека предоставляет функцию std::uncaught_exception, которая в деструкторе позволяет узнать, почему уничтожается объект, из-за выброшенного исключения, или же по какой-либо другой причине.

    Несмотря на то, что эта функция может показаться весьма полезной, постарайтесь избежать ее использования. Думайте в первую очередь о том, как добиться бесперибойной работы деструктора. Не завязывайте логику его работы на причины уничтожения объекта.

Для ответа в этой теме необходимо авторизоваться.