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