2015-05-10 13 views
2

Я использую исключения 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 
} 
+0

'SEH' - это термин Windows, но' noexcept' не является ключевым словом Visual Studio. Не могли бы вы указать свой компилятор и ОС? – Dialecticus

+0

Вы первое замечание отлично, это важная информация о декларации, которая не может быть указана кодом. –

+0

Я использую C++ 11 для Windows, но я думаю, что есть что-то похожее на SEH на другие ОС. –

ответ

1

Спецификация исключений в C++ работает только с исключениями C++, а не с исключениями Windows (SEH). В частности, исключения Windows не могут быть обнаружены с помощью блока C++ try-catch. Большинство условий, которые вызывают исключение Windows, классифицируются как неопределенные или определенные по реализации поведения по стандарту.

+0

Так что я не должен заботиться о них вообще? –

+0

Это зависит от того, работаете ли вы на уровне языка или на уровне системы. – Lingxi

+0

Это зависит от потребностей вашего приложения. Если вы вызываете функции (например, в API win32 или сторонней библиотеке), которые запускают SEH, вам, вероятно, придется обращаться с ними, чтобы убедиться, что ваша программа работает правильно. Тем не менее, профилактика лучше, чем лечение - лучше сделать все возможное, чтобы предотвратить появление неопределенного поведения, чем восстановить после этого факта. Но это верно и для использования исключений - часто лучше избегать возникновения условий ошибки, если это вообще возможно, чем восстановить из исключения после того, как какой-то код обнаружил условие ошибки. – Peter

 Смежные вопросы

  • Нет связанных вопросов^_^