Я использую исключения C ++ в своем коде вместо возвращаемых значений для обозначения ошибок, поэтому мой код должен быть безопасным для исключений. Поэтому я добавляю спецификацию исключения как комментарий к моим объявлениям функций. Например:
// Does x and y. strong-guarantee
void XandY();
// Checks something.
bool CheckSomething() noexcept;
Это хорошая практика?
Кроме того, если я оцениваю свой код для создания этих спецификаций, должен ли я иметь в виду только исключения C ++ или также исключения SEH, такие как разыменование nullptr, переполнение или деление на ноль исключений?
Допустим, я использую стороннюю библиотеку, которая никогда не генерирует исключения C ++, но может генерировать исключения SEH. Может ли моя функция, которая опирается на функции этой библиотеки, быть когда-либо ничем, кроме?
void MyFunction() noexcept // <-- Is noexcept viable?
{
OtherFunction(); // may throw SEH exception
}
Спецификация исключений C ++ работает только с исключениями C ++, но не с исключениями Windows (SEH). В частности, исключения Windows не могут быть перехвачены с помощью C ++. try-catch
блок. Большинство условий, которые вызывают исключение Windows, классифицируются стандартом как неопределенные или определяемые реализацией поведения.