名为Iterator&例外

时间:2009-07-19 08:55:44

标签: c# exception iterator

我正在编写一个需要检查一些参数的方法,如果验证它们,则返回一个IEnumerable。 E.g。

public static IEnumerable<double> GetEnum(int param)
{
    if (!IsValidParameter(param))
    {
        throw new Exception();
    }

    while(true)
    {
        yield return 5.0;
    }
}

但是,我相信由于懒惰的评估,当我使用错误的参数运行我的单元测试,但是还没有调用任何IEnumerable方法时,不会抛出异常。

[Test]
[ExpectedException(typeof(Exception))]
void Test()
{
    var ie = GetEnum(bad_param);
}

我可以通过在另一个函数(比如Foo)中构建IEnumerable来解决问题,然后检查GetEnum中的参数并调用Foo,但是有没有创建多个函数的解决方案?

干杯,尤尔根

3 个答案:

答案 0 :(得分:9)

由于定义了迭代器块,您目前需要两种方法来实现此目的:

public static IEnumerable<double> GetEnum(int param) {
    if (!IsValidParameter(param)) {
        throw new Exception();
    }
    return GetEnumCore(param);
}
private static IEnumerable<double> GetEnumCore(int param) {
    while(true) {
        yield return 5.0;
    }
}

只延迟迭代器块(GetEnumCore); GetEnum立即运行,执行检查。

答案 1 :(得分:2)

您是否可以使用基础枚举器启动迭代?

[Test]
[ExpectedException(typeof(Exception))]
void Test()
{
    var ie = GetEnum(bad_param);
    var en = ie.GetEnumerator();
    en.MoveNext();
}

答案 2 :(得分:2)

只要你不开始枚举你的方法永远不会被调用。您可以尝试在测试中枚举:

var ie = GetEnum(bad_param).First();