Должен ли я использовать спецификатор исключений в C ++? - PullRequest
119 голосов
/ 18 сентября 2008

В C ++ вы можете указать, что функция может генерировать или не генерировать исключение, используя спецификатор исключения. Например:

void foo() throw(); // guaranteed not to throw an exception
void bar() throw(int); // may throw an exception of type int
void baz() throw(...); // may throw an exception of some unspecified type

Я сомневаюсь в том, чтобы использовать их из-за следующего:

  1. Компилятор на самом деле не обеспечивает строгое указание исключений, поэтому преимущества невелики. В идеале вы хотели бы получить ошибку компиляции.
  2. Если функция нарушает спецификатор исключения, я думаю, что стандартное поведение - завершить программу.
  3. В VS.Net он рассматривает throw (X) как throw (...), поэтому соблюдение стандарта не является сильным.

Как вы думаете, следует использовать спецификаторы исключений?
Пожалуйста, ответьте «да» или «нет» и укажите несколько причин, чтобы оправдать ваш ответ.

Ответы [ 14 ]

2 голосов
/ 18 сентября 2008

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

Я согласен, они не очень полезны для обеспечения корректности стиля Java в компиляторе, но это лучше, чем ничего или случайные комментарии.

2 голосов
/ 18 сентября 2008

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

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

Я также отмечу, что Скотт Мейерс рассматривает эту тему в более эффективном C ++. Его книги «Эффективный С ++» и «Более эффективный С ++» - очень рекомендуемые книги.

0 голосов
/ 21 декабря 2009

Из статьи:

http://www.boost.org/community/exception_safety.html

«Хорошо известно, что невозможно написать исключительный универсальный контейнер ». Это требование часто слышат со ссылкой на статью Тома Каргилл [4], в котором он исследует проблема исключительной безопасности для универсальный шаблон стека. В его статья Каргил поднимает много полезного вопросы, но, к сожалению, не удается представить решение его проблемы. 1 Он в заключение, предположив, что Решение может быть невозможным. К сожалению, его статья была прочитана многие как «доказательство» этого предположения. С момента опубликования много примеров исключительной безопасности универсальные компоненты, в том числе C ++ контейнеры стандартной библиотеки.

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

0 голосов
/ 20 октября 2008

Спецификации исключений = мусор, спросите любого разработчика Java старше 30

...