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