2016-11-15 7 views
1

現在、構造化例外処理(SEH)メカニズムについてお読みいただき、C++でいくつかの演習を行っています。C++ SEH - EXCEPTION_DISPOSITION列挙型と__except()フィルタ式の間の相関

私は理解していないことの一つにされた -

excpt.hファイルには二つの重要な定義は「グループ」があります。

  1. EXCEPTION_DISPOSITION列挙型の定義と_except_handlerコールバックの定義は、機能
  2. 3つのマクロの定義 - EXCEPTION_EXECUTE_HANDLER(値は1)、EXCEPTION_CONTINUE_SEARCH(値が0)、EXCEPTION_CONTINUE_EXECUTION(値は - 1)

私は理解したよう - EXCEPTION_DISPOSITION

  • 値が使用されている_EXCEPTION_REGISTRATION stuctを使用して例外コールバック関数ハンドラ(のリンクリストを通過するときは、スレッド情報/環境ブロックで指さが指しますFSレジスタ)。 3つのマクロの

  • 値は_exceptフィルタ

EXCEPTION_DISPOSITION列挙型の名前のいくつかは、上記の3つのマクロと同じ名前を持っているとして使用されているが、それらは、(い​​くつかの全く異なる責任を持っています_exceptフィルタとして使用され、その他は_EXCEPTION_REGISTRATIONのリンクリストを反復するために使用されます)。

基本的に私の質問は - この相関の理由は何ですか? それらの間に「交差点」がありますか? (彼らは何らかの形で一緒に "働いていますか")

私はここに何かが欠けていますか?

答えて

3

例外のMSVC++ランタイムライブラリサポートは、OSの例外サポート(SEH)の上に構築されています。確かに、強い相関があります。 OSは-1、0、または1で次の処理を決定するだけで、マクロ値はSDKから複製されます。

そうでなければ、C++のtry/catchキーワードから生成されたコンパイラ生成の例外フィルタによって返される列挙型と直接一致しません。ランタイムライブラリはその値を解釈し、SEH値を生成します。正確に「入れ子になった例外」と「衝突したもの」とは、まあまあ、暗いことを意味するかもしれません。すべてのソースコードが利用できるわけではありません。あなたはそれを純粋な実装の詳細のように扱う必要がありますが、自分のコードにはまったく影響しません。

あなた自身の__except()でSEH値を使用したことはこれまでにありません。

+0

まず、お返事いただきありがとうございます。第二に、私は列挙に関してあなたが言ったことを完全に理解しているかどうかはわかりません。あなたはそれがコンパイラによって生成された例外フィルタによって返されたと私はそれを使用する必要がある唯一の時間は私自身の__except()を実装するときだと言いました。あなたがそれを説明することができれば素晴らしいだろう。私が知っていることは、EXCEPTION_DISPOSITIONが_except_handler(例外コールバック関数)の実装の戻り値として使用されていることです。ありがとうございました。 – golosovsky

+0

私は*正確な*反対: "あなたは純粋な実装の詳細のようにそれを扱う必要がある、それはあなた自身のコードに全く影響を与えない"と言った。あなたがそれを得ていないという不思議、私はなぜ推測できません。私は繰り返します:自分の '__try/__ except'コードでのみマクロ値を使用し、enumは使用しないでください。 –