Может кто-нибудь объяснить мне спецификации исключений C ++? - PullRequest
12 голосов
/ 04 мая 2010

Может ли кто-нибудь объяснить Спецификации исключений, используемые в C ++?

  • Когда они используются (я редко видел, чтобы они использовались в коде)
  • Каковы плюсы и минусы (преимущества / недостатки) использования спецификаций исключений?

Ответы [ 5 ]

15 голосов
/ 04 мая 2010

Когда они используются (я редко видел, чтобы они использовались в коде)
Надеюсь, никогда, так как они устарели в следующей версии C ++ из-за стандартизации в следующем году.

Каковы плюсы и минусы (преимущества / недостатки) использования спецификаций исключений?
Они позволяют читателям вашего кода точно знать, какие исключения разрешено использовать функции. Проблема заключается в том, что если выдается непредвиденное исключение (которое отсутствует в спецификации), то программа будет остановлена ​​(по умолчанию).

13 голосов
/ 04 мая 2010

Их обычно считают плохой идеей.

Они говорят, что метод бросит. Недостатком является то, что если этот метод выбрасывает что-то еще, то ваше приложение завершается. Так что это гарантия, но не так, как это делает Java. И это добавляет накладные расходы на проверку.

6 голосов
/ 04 мая 2010

Важно знать: спецификации исключений устарели в следующей версии C ++, за исключением спецификатора no-throw (throw()), который в основном официально гласит: «не используйте их».

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

Пример:

void MyFunction() throw() // does not throw any exceptions
{
    /* ... */
{
2 голосов
/ 04 мая 2010

Они указывают программисту, какие исключения будут выброшены из этой функции.У них есть преимущество в том, что у вас есть гарантия того, что никакие другие исключения не могут быть выброшены из этой функции.Однако во время компиляции нет проверки того, действительно ли функция генерирует какие-либо исключения, кроме тех, которые указаны в спецификаторе throw.Вместо этого он проверяется во время выполнения.И если это не удается, то вызывается unexpected(), который по умолчанию вызывает abort(), что, в свою очередь, по умолчанию завершает вашу программу.Так что, если вы действительно не хотите, чтобы ваша программа умерла, если вы облажались и возникло непредвиденное исключение, возможно, это плохая идея.

Единственное место, где я бы порекомендовал использовать их, это деструкторы.Это действительно плохо, если бросает деструктор.Они должны никогда бросать.Итак, если вы используете throw() для деструктора, чтобы указать, что оно не может вызвать исключение, то вы знаете, что ваша программа умрет, а не продолжит работать в плохом состоянии, в котором она была бы после того, как исключение было сгенерировано из деструктора..

В любом случае, если вы используете какой-либо спецификатор броска, вы должны быть уверены, что действительно хотите, чтобы ваша программа умерла, если она нарушена.Так что, вообще говоря, лучше не использовать их.

0 голосов
/ 04 мая 2010

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

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

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