强制收益返回方法在调用时抛出异常

时间:2017-10-26 13:31:38

标签: c# exception yield-return

我有一个我继承的方法,它返回一个IllegalFormatConversionException,并通过public class printf_function_test { public static void main(String[] args) { int any = 5; String object = "car"; char[] ch = {'3','5','6','9'}; System.out.println(ch); System.out.printf( "%d anything can happen anytime ,bought a %s and write" + "this number now %c", any, object, ch ); } } 构造实现:

IEnumerable<whatever>

我发现了一个错误,如果其中一个类的集合为null,则会导致无限循环,所以我添加了一个检查并编写了一个测试:

yield return myWhatever

我现在意识到这个测试失败了,因为即使我调用该方法(由于public IEnumberable<whatever> GetWhatevers() { while (true) { // do calculations yield return myWhatever } } 构造),我也从未真正开始迭代结果。

我可以通过这样做来修复测试:

public IEnumberable<whatever> GetWhatevers() {

    if (_dependentList == null || _dependentList.Count == 0) {
        throw new InvalidOperationException("Unable to process without whatevers");
    }

    while (true) {      
        // do calculations
        yield return myWhatever
    }
}

void MyWhateverThrowsIOEOnEmptyList() {
    var sut = new MyThing(null);
    Assert.ThrowsException<InvalidOperationException>(() => {
        var results = sut.GetWhatevers();
    });
}

......但我不喜欢它。这意味着无论调用者调用此方法,他们都不会知道,直到尝试访问结果,其中隐藏了一个IOE。由此产生的变量可以传播到Timbucktu然后回来,一直都不知道它是定时炸弹。

所以现在,只要我使用这种方法,我就必须记住潜伏在其中的可能异常。

这个方法对我来说太复杂了,不想用传统的循环重写。有没有办法可以强制将异常抛出&#34;通话时间&#34;而不是在&#34;解决时间&#34;这样我在打电话时就知道有问题吗?

1 个答案:

答案 0 :(得分:1)

从另一个调用iterator方法:

public IEnumerable<Whatever> GetWhatevers(){
    if (_dependentList == null || _dependentList.Count == 0) {
        throw new InvalidOperationException("Unable to process without whatevers");
    }

    return GetWhatevers_Impl();
}

private IEnumerable<Whatever> GetWhatevers_Impl(){
     while (true) {      
        // do calculations
        yield return myWhatever
    }
}