Share via


C (構造化) と C++ の混合例外

移植可能なコードを記述する場合は、C++ プログラムで構造化例外処理 (SEH) を使用することは推奨されません。 ただし、/EHa を使用してコンパイルし、構造化例外と C++ ソース コードを混在させる場合は、両方の種類の例外を処理するための機能が必要です。 構造化例外ハンドラーにはオブジェクトまたは型指定された例外の概念がないため、C++ コードによってスローされる例外を処理することはできません。 ただし、C++ catch ハンドラーは構造化例外を処理できます。 C++ 例外処理構文 (trythrowcatch) は C コンパイラでは使用できませんが、構造化例外処理構文 (__try__except__finally) は C++ コンパイラでサポートされます。

構造化例外の C++ 例外としての処理方法の詳細については、「_set_se_translator」を参照してください。

構造化例外と C++ 例外を混在させる場合は、次の潜在的な問題に注意してください。

  • C++ の例外と構造化例外を、同じ関数内で混在させることはできません。

  • 例外がスローされた後のアンワインド中であっても、終了ハンドラー (__finally ブロック) が常に実行されます。

  • C++ 例外処理は /EH コンパイラ オプションを使用してコンパイルされたすべてのモジュールで、アンワインド セマンティクスをキャッチし、保持できます (これによりアンワインド セマンティクスが有効になります)。

  • デストラクター関数がすべてのオブジェクトに対して呼び出されない状況もあります。 たとえば、初期化されていない関数ポインターを使用して関数呼び出しを行うときに、構造化例外が発生する可能性があります。 関数のパラメーターが呼び出しの前に構築されたオブジェクトである場合、スタックのアンワインド中に、これらのオブジェクトのデストラクターは呼び出されません。

次のステップ

関連項目

例外とエラー処理に関する最新の C++ のベスト プラクティス