2011-12-01 5 views
1

NUnitのThrowsメソッドのようなメソッドを作成しました。 基本的には、動作しているアクションがTタイプの例外またはジェネリック引数として渡された派生した例外タイプを発生させる場合、メソッドはtrueを返す必要があります。デバッガで実行したときとデバッガで実行したときの矛盾した動作を排除する方法

Action a =() => Throw(new DerivedException()); 
if(!a.Throws<BaseException>()) 
     throw new Exception("catastrophic error"); 

私はヘルパーThrowのメソッドを使用して、特定の型の例外をスローします。
DerivedExceptionクラスは、Exceptionクラスから派生したBaseExceptionクラスから派生しています。

デバッガが接続されているかどうかによって、Throwsメソッドの動作が異なります。デバッガが接続されていない場合、このメソッドは、私が期待することを行います。デバッガが接続されている場合、DerivedExceptionBaseExceptionとしてキャッチされず、代わりにExceptionとしてキャッチされます。

は、ここで再現するコードです(コンソールアプリケーションのプロジェクトファイルに行くことができます。):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Action a =() => Throw(new DerivedException()); 
      if (!a.Throws<BaseException>()) 
       throw new Exception("catastrophic error."); 
      else 
       Console.WriteLine("wow, you must not have been debugging."); 
     } 
     private static void Throw<T>(T exc) where T : Exception 
     { 
      throw exc; 
     } 
    } 

    public static partial class ExtensionMethods 
    { 
     public static bool Throws<T>(this Action action) where T : Exception 
     { 
      try 
      { 
       action.Invoke(); 
      } 
      catch (T) 
      { 
       return true; 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.GetType()); 
       return false; 
      } 
      return false; 
     } 

    } 


    public class BaseException : Exception 
    { 
    } 
    public class DerivedException : BaseException 
    { 
    } 



} 

ヒットF5(デバッグ)と、それが適切にDerivedExceptionをキャッチしません。 Ctrl + F5(デバッグなし)を押してください。をBaseExceptionとしてキャッチするとうまくいきます。

誰かが矛盾を説明できますか?ありがとう。

更新 .NET Frameworkのバージョン3.5 SP1でVS 2008 Professional Editionを実行しています。明らかに、これはそれ以降のバージョンでは問題になりません。これを試した皆さん、ありがとう。

+0

[Assert.Throws](http://www.nunit.org/index.php?p=exceptionAsserts&r=2.5.10)を使用していない理由はありますか? – TrueWill

+2

「最初のチャンス」メッセージは出力ウィンドウで何を表していますか? –

+0

@TrueWill:私は古いバージョンのNUnitを使用しています。時には自分自身でやりたいことがあります。私の実装に間違ったことはありますか? – user420667

答えて

0

ここでの答えは、Visual Studioの新しいバージョン(2010以降)にアップグレードすることです。

関連する問題