2011-01-01 39 views
20

実用的な相違点/含意の箇条書きリストを教えてください。関連するMSDNの記事を読んでいますが、私の理解している非同期の例外はまだ少しばかりです。EHsc vc EHa(非同期と非同期の例外処理)

私はBoost.Testを使用してテストスイートを書いていますし、私のコンパイラがEHAを有効にする必要があるという警告を発する:

はC4535警告:)を呼び出す_set_se_translator(/ EHAは、プロジェクト自体が使用する

必要です(STLからの)単純な例外のみで、/ EHaスイッチは必要ありません。テストスイートを正しく動作させるために/ EHaスイッチで再コンパイルする必要がありますか?私の気持ちは、テストスーツのためだけに/ EHaが必要だということです。

答えて

30

/EHscを使用すると、コンパイラはtry {}ブロックでラップされたコードがC++例外をスローする可能性があることを検出すると、例外フィルタのコードを出力します。例外フィルタは、例外処理中にスタックが巻き戻されたときに、ローカルのC++オブジェクトのデストラクタが呼び出されることを保証します。 RAIIを動作させます。

これは、x86コードの最適化、スペース、時間、x64コードのスペースです。スペースは、例外的なフィルタコードを省略することができるため、適度なbtwです。なぜなら、x86では、try {}ブロックに入るときに例外フィルタを登録することを避けることができるからです。非常に控えめなbtw。 x64では、例外フィルタを見つけるために別の方法が使用されます。これはテーブルベースです。

最初の段落のキーフレーズは「C++例外をスローする可能性があります」です。 Windowsでは、例外の他の原因があります。/EHaの "a"と同様に、ハードウェアによって生成される非同期例外です。浮動小数点例外、ゼロ除算、全能アクセス違反例外などがあります。しかし、とりわけ、あなたが相互に作用するかもしれないコードによって引き起こされる例外の種類。マネージコードと同様、基本的にはVM内で実行されるもの。

これらの種類の例外に対してオブジェクトを安全にしたい場合は、コンパイラにを常に通知するように/ EHaを使用する必要があります。例外フィルタを登録します。

/EHaの厄介な副作用に気をつけて、キャッチ(...)を飲み込む。すべて例外。 AVやSOのような、決して捕まえてはいけないものも含めて。それが重要であれば__try/__exceptと_set_se_translator()を見てください。

+2

+1私はx86とx64の違いを知りませんでした。 x64プログラミングに関する参考文献をお勧めしますか? 「x86プログラマー向けのx64プログラミングの10分の紹介」のようなものです:) – 9dan

6

/EHaを使用しないと、予期しない例外が検出されず、テストプログラムが異常終了することがあります。

異常終了のテストができる場合は、/ EHaと対立しない方がいいでしょう。

さらに、/ EHaにオプションを変更すると、実行可能ファイルサイズの増加やパフォーマンス低下などの多くの副作用が発生します。元の動作を効果的に変更します。

/EHaを使用するか使用しないかは、通常はプログラム設計段階で大きな決定です。

IMHO、テストケースの作成時の問題は、この決定を変更するにはあまり重要ではありません。