В чем преимущество ограничения бросков, разрешенных функцией С++?

В чем преимущество объявления возможных исключений из функции С++? Другими словами, что действительно делает ключевое слово throw()?

Я читал, что объявление функции, например void do_something() throw();, должно гарантировать, что из функции do_something() не исчисляются исключения; однако, похоже, это не относится к функциям, называемым внутри do_something(), что делает его слабой гарантией.

Просьба указать полезность (и наилучшие варианты использования) этой языковой функции.

Ответ 1

Никто не объясняет это лучше, чем Саттер

http://www.ddj.com/architect/184401544

Короткий вариант

  • Никогда не пишите спецификацию исключения
  • За исключением, возможно, пустой

Ответ 2

Стандарт С++ требует, чтобы вызывалась функция unexpected(), если функция пытается выставить исключение, не входящее в его список исключений. Краткое описание этого из MSDN находится здесь: http://msdn.microsoft.com/en-us/library/awbt5tew(VS.80).aspx

Большинство компиляторов фактически не поддерживают эту функцию С++.

Ответ 3

void do_something() throw(); 

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

BTW: Общепринятое определение надежной гарантии исключения: если по какой-то причине сбой общественной операции происходит, генерируется исключение, а состояние объекта остается неизменным (атомная операция).

Ответ 4

В принципе, объявляя функцию с throw();, вы сообщаете компилятору, что вы на сто процентов уверены, что функция не собирается бросать любые исключения, позволяя компилятору выполнять некоторые оптимизации, Если ваша функция выдает исключение в любом случае, у вас проблемы, так как это, скорее всего, приводит к поведению undefined.