【发布时间】:2013-06-05 10:39:06
【问题描述】:
上面提到的关于 SO 的另一个问题+答案的块不包含适用于此的正确答案!
我有一个用于单元测试的方法。此方法的目的是确保一段代码(由委托引用)将引发特定异常。如果抛出该异常,则单元测试成功。如果没有抛出异常或抛出其他类型的异常,则单元测试将失败。
/// <summary>
/// Checks to make sure that the action throws a exception of type TException.
/// </summary>
/// <typeparam name="TException">The type of exception expected.</typeparam>
/// <param name="action">The code to execute which is expected to generate the exception.</param>
public static void Throws<TException>(Action action)
where TException : Exception
{
try
{
action();
}
catch (TException)
{
return;
}
catch (Exception ex)
{
Assert.Fail("Wrong exception was thrown. Exception of type " + ex.GetType() + " was thrown, exception of type " + typeof(TException) + " was expected.");
}
Assert.Fail("No exception was thrown. Exception of type " + typeof(TException) + " was expected.");
}
下一次调用应该成功,但是失败了:
int result = 0;
Throws<DivideByZeroException>(() => result = result / result);
当TException 类型的预期异常被抛出时,它总是被第二个catch 捕获,而不是第一个catch。为什么是这样?
当然,我可以使用一次捕获并测试ex 是否属于TException 类型。我只是想知道/理解为什么这段代码可以编译但简单(从不?)有效。
编辑
应要求提供“工作”演示:
using System;
namespace GenericExceptionDemo
{
class Program
{
static void Main(string[] args)
{
int n = 0;
Catch<DivideByZeroException>(() => n = n / n);
}
static public void Catch<TException>(Action action)
where TException: Exception
{
try
{
action();
Console.WriteLine("No exception thrown. !!!Fail!!!");
}
catch (TException)
{
Console.WriteLine("Expected exception thrown. PASS!");
}
catch(Exception ex)
{
Console.WriteLine("An unexpected exception of type " + ex.GetType() + " thrown. !!!FAIL!!!");
}
}
}
}
【问题讨论】:
-
你使用什么单元测试框架?大多数已经有
Assert.Throws... -
您的代码对我有用...请展示一个简短但完整的程序来说明问题。
-
@Jon Skeet:忘掉单元测试故事吧……这是一个关于 try-catch 的问题。
-
@ChrisSpicer:我的目标是 .NET 4.5,但我很乐意尝试其他版本……一旦我们有了一个简短但完整的程序来演示 OP 的问题。目前我们只有 sn-ps,我更想知道我有完全相同的完整应用程序。
标签: c# visual-studio-2008 generics try-catch