Брутально и бессердечно о программировании и проектировании
ГлавнаяФорумАртПаттерныАнтипаттерныТест-драйвВопрос-ответКнигорецензииСправочная

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

Почему деструкторы не должны генерировать исключения? Обсудим одну из причин. Взгляните на этот код:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#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, которая в деструкторе позволяет узнать, почему уничтожается объект, из-за выброшенного исключения, или же по какой-либо другой причине.
Несмотря на то, что эта функция может показаться весьма полезной, постарайтесь избежать ее использования. Думайте в первую очередь о том, как добиться бессбойной работы деструктора. Не завязывайте логику его работы на причины уничтожения объекта.

Оглавление
Статистика
© 2007—2009 Inside C++ Коммерческие услугиКонтактная информация

Плитка москва piemmegres, керамическая плитка, плитка sabi керамическая плитка.. стелажи