Должен ли я добавить throw () в объявления для моих деструкторов C ++? - PullRequest
6 голосов
/ 19 января 2009

Я видел несколько классов C ++ с деструктором, определенным следующим образом:

class someClass
{
    public:
        someClass();
        ~someClass() throw();
};

Это хорошая идея?

Я хорошо знаю, что деструкторы никогда не должны генерировать исключения, но помешает ли это на самом деле тому, чтобы я генерировал исключения в моих деструкторах? Я не уверен на 100%, что это гарантирует.

Ссылка: этот недавний вопрос

Ответы [ 2 ]

7 голосов
/ 19 января 2009

Это не мешает вам генерировать исключения из вашего деструктора. Компилятор все равно позволит вам это сделать. Разница в том, что , если вы разрешите исключение из этого деструктора, ваша программа немедленно вызовет unexpected. Эта функция вызывает все, на что указывает unexpected_handler, что по умолчанию равно terminate. Поэтому, если вы не сделаете что-то для обработки неожиданного исключения, ваша программа завершит работу, что не является плохой идеей. В конце концов, если исключение действительно является неожиданным, то в действительности ваша программа ничего не сможет сделать для его обработки.

Это не что-то особенное в деструкторах; одни и те же правила применяются к спецификациям исключений для всех методов.

3 голосов
/ 19 января 2009

Это не ужасная идея. Если вы добавите dtor, пока не передается никакое исключение, вы немедленно прервете, что даст вам знать, что вы забыли сделать фактический не бросающий dtor.

Если, с другой стороны, вы не указали спецификацию выброса, вы узнаете о своей плохой реализации dtor только в том случае, если на самом деле выдается исключение.

...