質問

すべてのC ++開発者が知っておくべき構造化された例外についてどのような重要な点がありますか?

役に立ちましたか?

解決

それらはUNIX信号に相当するWin32であり、アクセス違反、違法指導などのCPUの例外をゼロで分割することができます。

適切なコンパイラオプション(Visual C ++の場合は/EHA)を使用すると、C ++例外は、C ++(ユーザー)の例外とSEH(OS)の例外の両方でStack巻き戻しが適切に機能するのと同じメカニズムを使用します。

C ++の例外とは異なり、SEHは入力されませんが、すべてが例外コード(原因)を持つ同じデータ構造と、障害の時点でCPUレジスタが保持しているものに関する追加情報を共有します。見る GetExceptionCodeGetExceptionInformation これの詳細については。

また、SEHには「ファーストチャンス」ハンドリングがあります。これにより、例外をログに記録または処理することができます 巻き戻すと、すべてのローカル変数が破壊されます。

他のヒント

私は最近、SEHによって間接的に引き起こされた問題を抱えていました。

SEHが使用される場合、デストラクタは呼び出されないため、デストラクタにクリーンアップコードがある場合はクリーンアップされません。

私たちの問題は、コンストラクターにロックされたオブジェクトによって包まれ、デストラクタでロック解除された重要なセクションによって引き起こされました。

デッドロックの状況があり、理由を理解できませんでした。コードとダンプを掘り下げてデバッグを掘り下げた後、COMによって処理され、重要なセクションがロックされたままになった例外があるためだと理解しました。 。プロジェクトプロパティのVSのコンピレーションフラグを変更しました。これは、SEHでもデストラクタを実行し、問題を解決したことを指示しました。

したがって、コードでSEHを使用しない可能性がありますが、(comのように)行うライブラリを使用している場合があり、予期しない動作を引き起こす可能性があります。

彼らは標準のC ++の一部ではないことを知っている必要があります - それらはMicrosoftの発明であり、C ++以外の言語で使用できます。

Win32™構造化例外処理の深さに関するクラッシュコース

その記事はです SEHでスピードを上げることを参照してください。 13年後、まだ最高です。

MSDNには専用のトピックがあります SEH対C ++例外処理の違い.

C ++開発者がSEHが議論されているかどうかを知る必要があるいくつかのこと:

c/c ++ sehを書く 例外ハンドラー:

__try 
{
   // guarded code
}
__except ( expression )
{
   // exception handler code
}

これは いいえ C ++例外処理は、まっすぐなINOT SEHをフックするためのMS固有の拡張機能です。それは、あなたの走行中のC ++の例外とは非常に異なって機能します。これらを使用するには、SEHをよく理解する必要があります。

c/c ++ sehを書く 終了ハンドラー:

__try {
   // guarded code
}
__finally ( expression ) {
   // termination code
}

SEHハンドラーと同じように、これをC ++例外セマンティクスと混同しないでください。 SEHのよく理解が必要です。

_set_se_trasnlator: :これは、非同期例外が使用されているときにSEHの例外をC ++タイプの例外に変換する関数です /eha.

そして最後に、個人的な意見:C ++開発者はSEHを知っているべきですか?あなたの最初のルーキーの後 .ecxr プッシュがC ++の例外を突き出すようになると、あなたの便利さのために提供される幻想にすぎないことを理解するでしょう。起こっているのはsehだけです。

重要なポイントは、SEHを使用するタイミングと標準のC ++例外をいつ使用するかを知ることです。まず、1つのシステムのみを選択します。ミキシングシステムは問題がある傾向があり、両方を深く理解するために深い理解を必要とします。第二に、高レベルでは、SEHはC ++に限定されませんが、標準のC ++例外はWindowsに限定されません。これが決定を決定しない場合は、不十分でない限り、標準の例外を選択します(SEHができることの詳細については、他の回答を参照してください)。

からの引用 Microsoftのドキュメント (2018年8月13日付の)この結論を支持しています。

構造化された例外処理(SEH)は、ハードウェア障害などの特定の例外的なコード状況を優雅に処理するためのCのMicrosoft拡張です。 WindowsおよびMicrosoft C ++はSEHをサポートしていますが、コードをよりポータブルで柔軟にするため、ISO標準のC ++例外処理を使用することをお勧めします。それにもかかわらず、既存のコードまたは特定の種類のプログラムを維持するには、SEHを使用する必要がある場合があります。

なぜ拡張機能の著者は、ほとんどの場合に使用されないことを推奨するのでしょうか?おそらく、拡張がCのために記述され、現在のコンテキストがC ++であるためです。言語は似ているので、「特定の種類のプログラム」だけが本当に利益を得るにもかかわらず、SEHをサイドベネフィットとしてC ++に移植することはおそらく十分に簡単でした。 (または、おそらく他の理由。C++が標準化される前に移植が開始された可能性があります。履歴が複雑になります。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top