2012-04-21 2 views
4

У меня есть функция-член, которая ничего не бросает, поэтому я добавил суффикс throw() к концу, указав, что он не будет вызывать никаких исключений.Можно ли использовать суффикс throw() для функции, содержащей std :: string?

Мой вопрос, в функции я использую несколько std::string, и позволяет сказать, что что-то пойдет не так в инициализации std::string, и он бросает bad_alloc или out_of_range (или что-либо еще может пойти не так с станд :: строка).

Можно ли еще добавить суффикс throw()?

+0

Возможный дубликат [about throw() in C++] (http://stackoverflow.com/questions/2157606/about-throw-in-c) – Troubadour

ответ

4

Herb Sutter says что

спецификации исключений придают гораздо меньше пользы, чем они стоят

Это может вызвать больше проблем, чем принести пользу. Итак, перед тем, как это сделать, вы должны подумать.

+0

+1 для цитирования Herb Sutter;) –

2

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

Если std::string выбрасывает изнутри вашу функцию, это обещание нарушается, и ваша программа не работает. (std::unexpected исключение, которое обычно означает, что ваша программа завершает жесткий)

Спецификация throw() является правильным, только если:

  • Ничто ваша функция не может бросить, даже косвенно

или

  • Ваша функция ловит все такие исключения и обычно выходит (без ретрова).
2

Две вещи.

Во-первых: спецификация throw() добавляет проверку выполнения, которую функция не выбрасывает, вызывая std::unexpected_exception, если обещание сломано, что прекратит выполнение программы.

Второй: throw() не рекомендуется, и он устарел в C++ 11. В C++ 11 вместо этого вы можете использовать noexcept (или более податливую форму noexcept(boolean-expression)). Нет проверки времени выполнения, и поведение не определено, если функция выбрасывает.

+0

+1. Узнал что-то новое. – Nawaz