2009-10-16 12 views
39

入力に応じていくつかの例外をスローする可能性があるコードのユニットテストを行っていました。だから私は以下のコードのようなものを試してみました:(たとえば簡体字)C#で一般的な例外を検出できないのはなぜですか?

static void Main(string[] args) 
    { 
     RunTest<ArgumentException>(); 
    } 

    static void RunTest<T>() where T : Exception, new() 
    { 
     try 
     { 
      throw new T(); 
      //throw new ArgumentException(); <-- Doesn't work either 

     } 
     catch (T tex) 
     { 
      Console.WriteLine("Caught passed in exception type"); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Caught general exception"); 
     } 
     Console.Read(); 
    } 

しかし、これは常に「キャッチ一般的な例外」をプリントアウトし、キャッチ(Tテックス)ハンドラは動作しません。 T()を投げるか、明示的にArgumentException()を投げるかは関係ありません。これはなぜですか?実際、私はcatch節でTを使用することさえできたことに驚いていましたが、これは可能ではないでしょうか?または、少なくともこのコンパイラがうまく動作しないという警告/エラーをコンパイラに与えますか?

私の環境はVisual Studio 2008と3.5がターゲットフレームワークです。

更新:コマンドプロンプトから直接試してみたところ、「例外が渡されました」というメッセージが表示されました。だから、これはVisual Studio内からの実行に限定されているようです。おそらく、Visual Studioホストプロセスの特異性ですか?

+1

よりデバッガでそれを実行してやるべきことをだと、それは例外型で渡さ巻き込まプリントアウト。あなたの環境とフレームワークのバージョンの詳細を教えてください。 –

+2

それは面白いです。私はVS2008のコンソールアプリケーションとしてそれを実行し、それは一般的な例外をキャッチ印刷されます。 –

+0

SnippetCompiler –

答えて

32

ここに奇妙な行動...

VS2k8コンソールアプリ。次"キャッチ一般的な例外"

try 
{ 
    throw new T(); 
} 
catch (T tex) 
{ 
    Console.WriteLine("Caught passed in exception type"); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine("Caught general exception"); 
} 

結果。

しかし、catchステートメントから(役に立たない)変数を削除:中

try 
{ 
    throw new T(); 
} 
catch (T) 
{ 
    Console.WriteLine("Caught passed in exception type"); 
} 
catch (Exception) 
{ 
    Console.WriteLine("Caught general exception"); 
} 

結果 "例外タイプで渡さキャッチ" !!!


更新

Heheh ...そのバグ:https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=362422&wa=wsignin1.0

ソース?ここに。 Why does catch(TException) handling block behaviour differ under the debugger after installing Visual Studio 2008?

2

TとExceptionの間の選択は例外であるため、ハンドラが呼び出される。

私はこれを試しましたが(C#またはVBではできませんが、私はILを編集しました)、Exception ExではなくObject Exをキャッチするように2番目のcatch節を変更しました。その場合、最初のハンドラヒットしました。

編集

他の人が指摘したように、それは私がちょうどLinqPadでそれをテストし、特定のタイプ

関連する問題