NUnitのThrows
メソッドのようなメソッドを作成しました。 基本的には、動作しているアクションがT
タイプの例外またはジェネリック引数として渡された派生した例外タイプを発生させる場合、メソッドはtrueを返す必要があります。デバッガで実行したときとデバッガで実行したときの矛盾した動作を排除する方法
Action a =() => Throw(new DerivedException());
if(!a.Throws<BaseException>())
throw new Exception("catastrophic error");
私はヘルパーThrow
のメソッドを使用して、特定の型の例外をスローします。
DerivedException
クラスは、Exception
クラスから派生したBaseException
クラスから派生しています。
デバッガが接続されているかどうかによって、Throws
メソッドの動作が異なります。デバッガが接続されていない場合、このメソッドは、私が期待することを行います。デバッガが接続されている場合、DerivedException
はBaseException
としてキャッチされず、代わりに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を実行しています。明らかに、これはそれ以降のバージョンでは問題になりません。これを試した皆さん、ありがとう。
[Assert.Throws](http://www.nunit.org/index.php?p=exceptionAsserts&r=2.5.10)を使用していない理由はありますか? – TrueWill
「最初のチャンス」メッセージは出力ウィンドウで何を表していますか? –
@TrueWill:私は古いバージョンのNUnitを使用しています。時には自分自身でやりたいことがあります。私の実装に間違ったことはありますか? – user420667