Поделиться через


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

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

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

При комбинировании структурированных исключений и исключений C++ обратите внимание на следующее.

  1. Исключения С++ и структурированные исключения невозможно комбинировать в одной функции.

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

  3. Во время обработки исключений C++ может перехватываться и сохраняться семантика очистки со всех модулях, скомпилированных с помощью параметра компилятора /EH (этот параметр разрешает семантику очистки).

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

Дополнительные сведения

См. также

Ссылки

Обработка исключений С++