C# 强制返回方法在调用时引发异常

C# 强制返回方法在调用时引发异常,c#,exception,yield-return,C#,Exception,Yield Return,我继承了一个方法,它返回一个IEnumerable,并通过yield return myWhatever构造来实现: public IEnumberable<whatever> GetWhatevers() { while (true) { // do calculations yield return myWhatever } } 。。。但是我不喜欢它。这意味着无论调用方调用这个方法是什么,在尝试访问结果之前,他们都不会

我继承了一个方法,它返回一个
IEnumerable
,并通过
yield return myWhatever
构造来实现:

public IEnumberable<whatever> GetWhatevers() {
    while (true) {      
        // do calculations
        yield return myWhatever
    }
}
。。。但是我不喜欢它。这意味着无论调用方调用这个方法是什么,在尝试访问结果之前,他们都不会知道里面隐藏着一个IOE。这个结果变量可以在Timbucktu来回移动,但永远不知道它是一颗定时炸弹

所以现在,每当我使用这个方法时,我都必须记住,其中可能隐藏着一个异常


这个方法太复杂了,我不想用传统的循环重写。有没有办法强制在“调用时”而不是“解决时”抛出异常,以便在调用时知道存在问题?

从另一个调用迭代器方法:

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
    }
}
public IEnumerable GetWhatevers(){
如果(_dependentList==null | |(u dependentList.Count==0){
抛出新的InvalidOperationException(“无法处理而无任何异常”);
}
返回GetWhatevers_Impl();
}
私有IEnumerable GetWhatevers_Impl(){
虽然(正确){
//计算
收益率
}
}

(这个丑陋的小副作用似乎不值得
yield
…)您可以将
收益返回
代码放入
私有getWhateVersionInternal()
中,让公共
GetWhatevers()
进行检查,然后
返回getWhateVersionInternal()。使用迭代器只需做一件有用的事情。他们肯定会迭代的。无论您是使用ToList()还是foreach或调用MoveNext(),这一点都无关紧要。@HansPassant-我还没有意识到这本身就是一个迭代器(第一次处理
收益率
),但我想我们即将对命名约定做一个小小的调整!Herp-a-derpa,那是关键。我会给你的,因为你先回答了,但也要感谢其他人。
void MyWhateverThrowsIOEOnEmptyList() {
    var sut = new MyThing(null);
    Assert.ThrowsException<InvalidOperationException>(() => {
        var results = sut.GetWhatevers().ToList();
    });
}
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
    }
}