2010-02-18 100 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启动。