0

我創建了這段代碼來查看,但我假設枚舉值是而不是在我測試時被懶惰地評估過。懶惰評估時,可枚舉異常的行號是多少?

public void EnumerableExceptionTest_CanOnlyBeTestedByInspectingError() 
    { 
     var ints = GetIntsButReallyThrowError(); // error occurs here. 
     var y = 10; 
     var z = 11; 
     foreach(var i in ints) // error *could* be on this line, but not in my tests. 
     { 
      Console.WriteLine(i+y+z); 
     } 

    } 
    private IEnumerable<int> GetIntsButReallyThrowError() 
    { 
     var x = true; 
     if (x) 
     { 
      throw new Exception("Threw this on purpose."); 
     } 
     else 
     { 
      return new int[]{1,2,3}; 
     } 
    } 

是否有可能,雖然不會發生,直到它懶洋洋地評估誤差,從而使錯誤行數將是foreach循環? *請注意,如果methodname不在callstack所說的那一行上,這在調試的時候記住這一點很有用。這並不一定意味着您的代碼/ pdbs已過時:-P

回答

3

問題是結構可能會或可能不會被懶惰地評估,但是您的方法一旦被調用就會執行。由於您的異常在返回任何內容之前被擊中,所以執行會拋出。

你可以試試這個。它利用yield關鍵字來暫時生成結果:

private IEnumerable<int> GetIntsButReallyThrowError() 
{ 
    yield return 1; 
    throw new Exception("Threw this on purpose."); 
} 
+0

是的,它做到了。謝謝。 – user420667

+1

請注意,您可以在第一個「yield」之前拋出異常,並且在調用方法時仍不會拋出異常;只有當你嘗試獲得第一個值。 – Servy