Спецификация исключения - PullRequest
14 голосов
/ 23 марта 2010

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

Ответы [ 3 ]

10 голосов
/ 23 марта 2010

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

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

0 голосов
/ 18 декабря 2012

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

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

0 голосов
/ 26 ноября 2011

Обзор 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 основных точек Херба, очевидно, абсолютно, безусловно неправильно, в соответствии с ним .

Что еще можно добавить?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...