C (構造化) と C++ の混合例外
移植可能なコードを記述する場合は、C++ プログラムで構造化例外処理 (SEH) を使用することは推奨されません。 ただし、/EHa
を使用してコンパイルし、構造化例外と C++ ソース コードを混在させる場合は、両方の種類の例外を処理するための機能が必要です。 構造化例外ハンドラーにはオブジェクトまたは型指定された例外の概念がないため、C++ コードによってスローされる例外を処理することはできません。 ただし、C++ catch
ハンドラーは構造化例外を処理できます。 C++ 例外処理構文 (try
、throw
、catch
) は C コンパイラでは使用できませんが、構造化例外処理構文 (__try
、__except
、__finally
) は C++ コンパイラでサポートされます。
構造化例外の C++ 例外としての処理方法の詳細については、「_set_se_translator
」を参照してください。
構造化例外と C++ 例外を混在させる場合は、次の潜在的な問題に注意してください。
C++ の例外と構造化例外を、同じ関数内で混在させることはできません。
例外がスローされた後のアンワインド中であっても、終了ハンドラー (
__finally
ブロック) が常に実行されます。C++ 例外処理は
/EH
コンパイラ オプションを使用してコンパイルされたすべてのモジュールで、アンワインド セマンティクスをキャッチし、保持できます (これによりアンワインド セマンティクスが有効になります)。デストラクター関数がすべてのオブジェクトに対して呼び出されない状況もあります。 たとえば、初期化されていない関数ポインターを使用して関数呼び出しを行うときに、構造化例外が発生する可能性があります。 関数のパラメーターが呼び出しの前に構築されたオブジェクトである場合、スタックのアンワインド中に、これらのオブジェクトのデストラクターは呼び出されません。
次のステップ
C++ プログラムで
setjmp
またはlongjmp
を使用するC++ プログラムでの
setjmp
とlongjmp
の使用については、こちらを参照してください。-
C++ を使用して構造化例外を処理する方法の例を参照してください。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示