Сочетание исключений C (структурированных) и C++

Если вы хотите написать переносимый код, не рекомендуется использовать структурированную обработку исключений (SEH) в программе C++. Однако иногда может потребоваться компиляция с использованием /EHa структурированных исключений и исходного кода C++ и требуется некоторое средство для обработки обоих видов исключений. Так как структурированный обработчик исключений не имеет понятия объектов или типизированных исключений, он не может обрабатывать исключения, создаваемые кодом C++. Однако обработчики C++ catch могут обрабатывать структурированные исключения. Синтаксис обработки исключений C++ (try, throw, catch) не принимается компилятором C, но структурированный синтаксис обработки исключений (__try, __except, __finally) поддерживается компилятором C++.

Дополнительные _set_se_translator сведения об обработке структурированных исключений в виде исключений C++.

Если вы смешиваете структурированные и C++ исключения, обратите внимание на следующие потенциальные проблемы:

  • Исключения C++ и структурированные исключения не могут быть смешанными в одной функции.

  • Обработчики завершения (__finally блоки) всегда выполняются, даже во время очистки после возникновения исключения.

  • Обработка исключений C++ может перехватывать и сохранять семантику очистки во всех модулях, скомпилированных с /EH параметрами компилятора, которые обеспечивают семантику очистки.

  • В некоторых ситуациях функции деструктора не вызываются для всех объектов. Например, структурированное исключение может возникать при попытке выполнить вызов функции с помощью неинициализированного указателя функции. Если параметры функции являются объектами, созданными перед вызовом, деструкторы этих объектов не вызываются во время очистки стека.

Следующие шаги

См. также

Современные рекомендации по C++ по исключению и обработке ошибок