2010-02-18 130 views
3

在我的C#2.0 WinForms應用程序中遇到了一個非常奇怪的問題,我甚至不確定它是否值得提問,因爲問題發生在一個奇怪的設置中,我不認爲你可以在沒有我的來源的情況下複製它,但我完全沒有想法。無法捕捉的異常來自無法訪問的代碼

我有一張表格,左側爲TreeView,右側爲ListViewTreeView顯示來自特定文件夾(包含我需要的文檔)的所有可用文件和子文件夾。如果選擇了文件夾,則ListView將顯示所選文件夾中的所有文件和子文件夾。在啓動時,我填充TreeView表單文件夾,之後我通過代碼選擇第一個TreeNode(在我的情況下它是一個文件夾)。此後,TreeView控件的內容是這樣的:

-folder 
    -file1 
    -file2 

選擇文件夾觸發TreeViewAfterSelecedEvent。因爲一個文件夾被選中我使用以下梅索德填充ListView

private void fillOverview(FAFolder folder) 
{ 
    lv_overview.Items.Clear(); 
    ListViewItem item; 
    foreach (FAFile file in folder.sortedContent) 
    { 
     if (file is FAFolder) 
     { 
      item = new ListViewItem(file.Name, "Folder"); //exception got thrown here 
     } 
     else 
     { 
      item = new ListViewItem(file.Name, file.Name); 
     } 
     item.Tag = file; 
     lv_overview.Items.Add(item); 
    } 
} 

正如你可以看到有沒有子文件夾,所以行item = new ListViewItem(file.Name, "Folder");不應該在此設置感動,但每一個現在,然後NullReferenceException了拋出。如果我用try/catch包裝這一行,那麼異常就會被拋出catch塊。我試圖檢查一切,如果它是null或不,但它不是nullreferences。或者,如果我在該行之前添加MessageBox,那麼異常仍會拋出,並且不會彈出MessageBox。這使我得出這樣的結論:執行堆棧跟蹤是錯誤的和/或這種例外來自其他Thread或類似的東西。

我是一個非常樂觀的人,我知道SO社區有多聰明,但我不認爲任何人都可以指出問題所在。所以我真正在尋找的是提示和建議,我如何找到並調試這種奇怪行爲的原因。

編輯:

internal abstract class FAFile 
{ 
    internal string Name; 
    internal readonly FAFolder Parent; 
    internal FAFile(FAFolder parent) 
    { 
     this.Parent = parent; 
    } 
} 

internal sealed class FAFolder : FAFile 
{ 
    internal readonly IDictionary<string, FAFile> Content = new Dictionary<string, FAFile>(); 
    internal FAFolder(FAFolder parent, string name) : base(parent) 
    { 
     this.Name = name; 
    } 
} 

internal sealed class FADocument : FAFile 
{ 
    public readonly string Path; 
    public FADocument(FAFolder parent, string path): base(parent) 
    { 
     this.Path = path; 
     this.Name = System.IO.Path.GetFileNameWithoutExtension(path); 
    } 
} 
+1

如果我們能看到FAFolder和FAFile的代碼會容易得多 – pdr 2010-02-18 13:03:15

+2

發佈堆棧跟蹤也會很有用 – Paolo 2010-02-18 13:24:49

+0

您是否檢查過folder.sortedContent的結果以確保您獲得了期望的結果? – 2010-02-18 13:25:15

回答

0

我的同事剛剛找到答案(可能)。我使用線程從HDD加載ImageListListView,並且此線程有時會凍結,如果我分配了ImageKey,它將失敗。這不是答案,爲什麼這個異常是無法解析的,或者爲什麼它會拋出這個(無法訪問)的線。但我強烈相信這是問題的原因。

0

您是否嘗試過在folder.sortedContent一個空檢查?

通常ReSharper會提示我這樣的東西應該有一個空檢查。

如果你想可以肯定的,下面一行添加到您的代碼,foreach循環以上:

if (folder.sortedContent == null) throw new Exception("It was null, dangit!"); 
+0

否,sortedContent allways返回一個'new List()' – 2010-02-18 13:18:10

0

就行了你提到:

item = new ListViewItem(file.Name, "Folder") 

,可能會導致的唯一的事情如果file爲null(除非從ListViewItem構造函數本身拋出異常),則返回NullReferenceException。

您不提供folder.sortedContent的代碼,所以我不能說 - 但是在某些情況下,這個集合中的某個元素可能爲空嗎?

如果ListViewItem構造函數拋出異常,那麼您將需要使用Reflector來查看代碼或下載參考源。

+0

'file'由於'if(文件是FAFolder)'而不能'null'。 'null is object'是allways'false'和'sortedContent' allways返回一個'new List()'。但是讓我們假設'sortedContent == null',而不是'foreach'的主體不被執行。 – 2010-02-18 14:15:11

0

該行不可達。由於FAFolder是FAFile派生的,因此'file FAFolder'將返回true。

但是,這意味着該文件不爲空,除非它被另一個線程更改。

編輯:文件不能被另一個線程更改,因爲它是本地引用。你能爲異常提供堆棧跟蹤嗎?這一個讓我現在感興趣。

0

我只是不禁想知道是FAFolder包含'。'或者父母和子目錄的'..'?並因此排序結果中斷?

如果事實證明這個答案是不真實的,這個答案會被相應地編輯嗎?

希望這會有所幫助, 最好的問候, 湯姆。

0
  • 這種異常可以根據需求重現嗎?
  • 你可以顯示異常的堆棧跟蹤嗎?
  • 拋出異常時,還有哪些線程正在運行?

一般來說,有兩種方法來調試這種類型的東西。第一種方法是所謂的「科學」調試:

  1. 設計一個理論來解釋觀察到的行爲。
  2. 設計一個實驗來測試理論。
  3. 運行實驗並觀察結果。

第二種方法是逐塊剝離實際代碼,直到不再觸發異常。那麼你有進一步調查的重要線索。

這使我的結論是,execption堆棧跟蹤是錯誤的....

通常更容易通過假設problem is in your own code啓動。