Ответ 1
Никто не объясняет это лучше, чем Саттер
http://www.ddj.com/architect/184401544
Короткий вариант
- Никогда не пишите спецификацию исключения
- За исключением, возможно, пустой
В чем преимущество объявления возможных исключений из функции С++? Другими словами, что действительно делает ключевое слово throw()
?
Я читал, что объявление функции, например void do_something() throw();
, должно гарантировать, что из функции do_something()
не исчисляются исключения; однако, похоже, это не относится к функциям, называемым внутри do_something()
, что делает его слабой гарантией.
Просьба указать полезность (и наилучшие варианты использования) этой языковой функции.
Никто не объясняет это лучше, чем Саттер
http://www.ddj.com/architect/184401544
Короткий вариант
Стандарт С++ требует, чтобы вызывалась функция unexpected()
, если функция пытается выставить исключение, не входящее в его список исключений. Краткое описание этого из MSDN находится здесь: http://msdn.microsoft.com/en-us/library/awbt5tew(VS.80).aspx
Большинство компиляторов фактически не поддерживают эту функцию С++.
void do_something() throw();
Это гарантия со стороны разработчика, что функция никогда не будет генерировать исключение. Это то, что ожидает клиент . Однако это также означает, что любое исключение, генерируемое где-то внутри функции, обрабатывается и не возвращается обратно родительскому элементу do_something()
. Позор для того, кто извне, изнутри, потому что нет ничего, что помешало бы ему бросить. Это связано с тем, что выброс из функции с пустой спецификацией исключений эквивалентен бросанию исключения, не упомянутого в спецификации, и ожидается, что std::unexpected()
следует за завершением программы.
BTW: Общепринятое определение надежной гарантии исключения: если по какой-то причине сбой общественной операции происходит, генерируется исключение, а состояние объекта остается неизменным (атомная операция).
В принципе, объявляя функцию с throw();
, вы сообщаете компилятору, что вы на сто процентов уверены, что функция не собирается бросать любые исключения, позволяя компилятору выполнять некоторые оптимизации, Если ваша функция выдает исключение в любом случае, у вас проблемы, так как это, скорее всего, приводит к поведению undefined.