Спецификация исключения

Я знаю, что эта функция будет устаревшей в C++0x, но для меня, как для начинающего, это кажется хорошей идеей иметь ее. Может ли кто-нибудь объяснить мне, почему это не хорошая идея?

3 ответа

Решение

Пожалуйста, посмотрите эту подробную статью Херб Саттер. У него есть самое подробное объяснение проблем и недостатков их конструкции.

Прагматичный взгляд на спецификации исключений

Насколько я понимаю, спецификация исключений означает:

Я не хочу, чтобы вы (компилятор) генерировали дополнительный код, который гарантирует, что исключением является один из этих типов. Если не звоните прекратить, пожалуйста, мы тост. Дополнительная проверка должна быть помещена в (неявный) обработчик исключений (необходимый для его реализации) при каждом вызове.

Обзор http://www.gotw.ca/publications/mill22.htm

Выпуск первый: "Система теневого типа"

Правда, мелкий технический момент, и его легко исправить.

Выпуск второй: (Mis) понимание

Вот что думают многие, что делают спецификации исключений:

Его первый пункт:

  • Гарантируйте, что функции будут выбрасывать только перечисленные исключения (возможно, нет).

Если это то, что люди думают, это очень хорошо, потому что это именно то, что гарантия ES, по определению. Херб соглашается в том же документе:

(ES) Обеспечить во время выполнения, что функции будут генерировать только перечисленные исключения (возможно, ни одного).

Его второй пункт:

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

Это тоже абсолютно правильно.

Он объясняет, почему это второе утверждение неверно, на примере:

// Example 1(b) reprise, and two
// potential white lies:
//
int Gunc() throw();    // will throw nothing (?)

int Hunc() throw(A,B); // can only throw A or B (?)

Комментарии верны? Не совсем. Gunc() действительно может что-то сгенерировать, а Hunc() вполне может скинуть что-то кроме A или B! Компилятор просто гарантирует, что побеждать их будет бессмысленно, если они это сделают... и большую часть времени обходить вашу программу тоже бессмысленно.

Поскольку Gunc () или Hunc() действительно могут выдать то, что обещали не делать, компилятор не только не может предположить, что этого не произойдет (...)

Последнее замечание Херба о том, что "(ES) принудительно применяет во время выполнения, что функции будут генерировать только перечисленные исключения (возможно, ни одного)." Также опровергает этот "аргумент"

Оба из 2 -х основных точек Херба, очевидно, абсолютно, бесспорно так, по его словам.

Что еще я могу добавить?

Я считаю, что слова имеют фиксированное значение, которое не может быть изменено по желанию, ради "аргумента".

Другие вопросы по тегам