2011-08-04 47 views
2

由於拋出了上述錯誤,我們有一些第三方代碼在此刻導致了一些痛苦:它有點奇怪,因爲它是一個間歇性錯誤。這是導致該問題的方法:收藏已修改;枚舉操作可能不會執行。錯誤

Private Shared Sub IntLocateDictionaries(ByVal haystack As ExpDictionary, 
     ByVal needlearray() As Object, _ 
     ByVal resultarray() As Object, ByVal removemarks As Boolean) 

     Dim i As Integer 
     Dim item As Object 

     For i = 0 To UBound(needlearray) 
      If haystack.Exists(needlearray(i)) Then 
       resultarray(i)(CStr(resultarray(i).Count + 1)) = haystack 
       If removemarks Then 
        ExpandIT.FileLogger.LogError("*********** REMOVING From HAYSTACK - COULD CAUSE EXCEPTION! ***************") 
        haystack.Remove(needlearray(i)) 
       End If 
      End If 
     Next 

     ' Scan for sub dictionaries 
     For Each item In haystack.Values 
      If TypeName(item) = "ExpDictionary" Then 
       IntLocateDictionaries(item, needlearray, resultarray, removemarks) 
      End If 
     Next 
    End Sub 

...這是主叫用戶線:

 currencyproducts = New ExpDictionary 
     priceproducts = New ExpDictionary 
     IntLocateDictionaries(info, New Object() {"_cc", "_csp"}, New Object() {currencyproducts, priceproducts}, False) 

我明白,這個錯誤通常是由試圖修改的集合,而造成枚舉因此爲什麼我在看似可能會改變集合的唯一行上添加日誌記錄...

由於添加了日誌記錄,我們仍然遇到了該問題,但是沒有記錄出現:這並不令人意外,因爲如果你看看呼叫線上的參數(th只有這個Sub被調用的地方) - removemarks被傳遞爲False - 這將通過遞歸調用一直向下傳遞,因此那個調用.Remove的行永遠不會被執行....我們看不到的事實日誌記錄證明了這一點....

任何人都可以看到任何其他可能會導致此問題!

感謝所有

理查德

回答

1

這是一個遞歸方法。看來這行導致錯誤

If removemarks Then haystack.Remove(needlearray(i))

這裏needlearray(i)可能由內遞歸方法進行修改,這將導致外遞歸方法拋出這個錯誤

+0

是的....我認爲這行看起來像罪魁禍首,但如果你看看調用代碼,參數[removemarks]被傳入爲False。這當然意味着這行代碼永遠不會執行!? – user481777

1

你迭代的haystack.Values收集和然後遞歸調用回可能把這個行:

If removemarks Then haystack.Remove(needlearray(i))

現在閱讀代碼,它應該工作,因爲你的迭代器在haystack.Values,而不是haystack。但我不知道什麼是Remove方法,也許它觸及.Values

您有兩種方法來解決這個問題:

  • 使用for循環,並通過列表倒數,並通過索引中刪除。
  • 收集要刪除的內容列表,並在迭代器結束時執行它們。

我相當肯定LINQ帶有一個需要lambda的Remove函數。

+0

是的,我認爲這行看起來像罪魁禍首,但如果你看看調用代碼,參數[removemarks]作爲False傳入。這當然意味着這行代碼永遠不會執行!? – user481777

+0

如果它是錯誤的,它將在整個持續時間內是錯誤的,並且不應該引起異常。但是我相當確信,在這段代碼中唯一可以導致這個錯誤的行是'.Remove'調用。 –

+0

我完全同意 - 但我已經在IntLocateDictionaries的整個Web應用程序上進行搜索,並且只在上面指定的一個地方調用 - 並且爲[removemarks]傳遞False ...因此,爲什麼我完全被困惑! – user481777

相關問題