C (構造化) と C++ の混合例外
移植性の高いコードを記述する場合は、C++ プログラムで構造化例外処理を使用することはお勧めしません。 ただし、/EHa でコンパイルし、構造化例外と C++ ソース コードを混在させる場合は、両方の種類の例外を処理するための機能が必要です。 構造化例外ハンドラーにはオブジェクトまたは型指定例外の概念がないため、C++ コードによってスローされる例外を処理することができません。ただし、C++ catch ハンドラーが構造化例外を処理できます。 したがって、C++ 例外処理構文 (try、throw、catch) は C コンパイラでは使用できませんが、構造化例外処理構文 (__try、__except、__finally) は C++ コンパイラでサポートされます。
構造化例外の C++ 例外としての処理の詳細については、「_set_se_translator」を参照してください。
構造化例外と C++ 例外を混在させる場合は、次の点に注意してください。
C++ の例外と構造化例外を、同じ関数内で混在させることはできません。
例外がスローされた後のアンワインド中であっても、終了ハンドラー (__finally ブロック) が常に実行されます。
C++ 例外処理は /EH コンパイラ オプションを使用してコンパイルされたすべてのモジュールで、アンワインド セマンティクスをキャッチし、保持できます (このオプションにより、アンワインド セマンティクスが有効になります)。
デストラクター関数がすべてのオブジェクトに対して呼び出されない状況もあります。 たとえば、初期化されていない関数ポインターを通じて関数呼び出しを試みているときに構造化例外が発生し、関数がその呼び出しの前に構築されたオブジェクトをパラメーターとして受け取る場合、それらのオブジェクトでスタック アンワインド中にデストラクターは呼び出されません。