Какова польза от ограничения бросков, разрешенных функцией C++?[закрыто]

StackOverflow https://stackoverflow.com/questions/609332

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Краткая версия

  1. Никогда не пишите спецификацию исключения
  2. Кроме, возможно, пустого

Другие советы

Стандарт 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(); вы сообщаете компилятору, что вы уверен на сто процентов что функция нет собирается генерировать любые исключения, позволяя компилятору выполнить некоторую оптимизацию.Если ваша функция все равно выдает исключение, у вас проблемы, поскольку это, скорее всего, приведет к неопределенному поведению.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top