質問

管理されていないC ++、Visual Studio 2008以降で新しいプロジェクトを作成している場合、どの例外ハンドリングモデルを使用したいですか?

/ehaオプションは効率の低いコードをもたらし、SEHの例外をキャッチすることを理解していますよね?

そのため、私はそのオプションを避け、通常 /EHSCを使用しているので、実際にスローされ、アクセス違反やその他の構造化された実行をキャッチしないC ++例外のみをキャッチしているように、CACT(...)ハンドラーのみをキャッチしています。私のコードにアクセス違反がある場合、Catch(...){}によってマスクされたくありません。

私は、キャッチ(...){}を何もしないようにしたい他の人とコーディングします。アクセス違反がある場合は、それをやりたいと思っています。これは私にとって本当に悪い考えのようです。コーディングが悪いためにバグがある場合、耳に指を貼り付けたり、「ラララララ!」と大声で言いたくありません。プログラムをクラッシュさせる必要がないように?実際、コーディングエラーのためにコードが悪い状態にある場合、コードを本当に続行したいですか?

私の一般的な考えは、 /ehaがより大きな /遅いコードを作成し、プログラマーが致命的なバグが存在する場合、未定義の状態で実行され続けるというコードを書くことを逃れることができるということです。

ところで、私は私たちがほとんどの部分で書いているものであるアプリケーションとサービスコードについて話している。低レベルのデバイスドライバーなどではありません。

あなたの考えを量ってください。

役に立ちましたか?

解決

/ehaは2つのことをします。何よりもまず、コードアナライザーがC ++例外をスローする可能性のあるコードが表示されない場合、ローカルクラス変数の破壊者を自動的に呼び出す例外フィルターを省略する最適化を抑制します。これにより、C ++例外だけでなく、あらゆる種類の例外に対してスタックが安全になります。これらの例外フィルターのオーバーヘッドは、X86の時間とX86とX64の両方のスペースです。

そして、はい、それはcatch(...)の動作を変化させます、それは今ではC ++だけでなく、SEH例外もフィルターします。あなたが本当に厄介なもの、非同期ハードウェアの例外をすべて捕まえるので、これは実際にギャンブルです。私は個人的には、すべてのC ++の例外をキャッチすることも非常に防御可能であるとは思いませんが、プログラム状態がどの程度変化し、なぜ失敗したのかについては、まだあいまいな考えを持っています。

現実的には、使用に切り替える必要があります __try/__except 独自の例外フィルターを作成し、悪いものをキャッチしないようにすることができます。 C ++例外の例外コードは0xE04D5343( "MSC")です。 _set_se_translator()を使用することも別のアプローチです。

他のヒント

.NET Interopでは安全であるため、 /ehaを使用していますが、 /ehscはそうではないかもしれません。見る ネイティブ(C ++)例外がCLRコンポーネントに伝播するときに呼び出されないデストラクタ 例えば。

ただし、特定のコードの場合、追加のパフォーマンスが実際に重要であり、.NET(またはその他の)互換性を必要としない場合は、確かに /EHSCは正常に聞こえます。

/ehscも /ehaどちらもほとんどのメモリエラーをキャッチしないため、これらを使用してアクセス違反をキャッチすることは絶望的なケースです。

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