C# 来自不可访问代码的不可修补异常

C# 来自不可访问代码的不可修补异常,c#,winforms,exception,C#,Winforms,Exception,我在我的C 2.0 WinForms应用程序中遇到了一个非常奇怪的问题,我甚至不确定是否值得这样问,因为这个问题发生在一个奇怪的设置中,我不认为没有我的来源你可以复制它,但我完全没有想法 我有一个表单,左边是树状视图,右边是列表视图。树视图显示特定文件夹中的所有可用文件和子文件夹,其中包含我的应用程序所需的文档。如果选择了文件夹,则列表视图将显示所选文件夹中的所有文件和子文件夹。在启动时,我从文件夹中填充TreeView,然后按代码选择第一个TreeNode,在我的示例中,它是一个文件夹。之后,

我在我的C 2.0 WinForms应用程序中遇到了一个非常奇怪的问题,我甚至不确定是否值得这样问,因为这个问题发生在一个奇怪的设置中,我不认为没有我的来源你可以复制它,但我完全没有想法

我有一个表单,左边是树状视图,右边是列表视图。树视图显示特定文件夹中的所有可用文件和子文件夹,其中包含我的应用程序所需的文档。如果选择了文件夹,则列表视图将显示所选文件夹中的所有文件和子文件夹。在启动时,我从文件夹中填充TreeView,然后按代码选择第一个TreeNode,在我的示例中,它是一个文件夹。之后,树视图的内容如下所示:

-folder
   -file1
   -file2
选择文件夹会触发TreeView的AfterElecedEvent。由于选择了文件夹,我使用以下方法填充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);
    }
}
如您所见,没有子文件夹,因此行项目=new ListViewItemfile.Name,Folder;在这个设置中不应该被触及,但是偶尔会抛出一个NullReferenceException。如果我用try/catch来包装这一行,那么就会在catch块中抛出异常。我尝试检查所有内容是否为null,但没有null引用。或者,如果我在这一行前面添加MessageBox,异常仍然被抛出,并且没有MessageBox弹出。这使我得出结论,execption stacktrace是错误的,并且/或者这个异常来自其他线程或者类似的东西

我是一个非常乐观的人,我知道SO社区有多聪明,但我认为没有人能指出问题所在。因此,我实际上在寻找的是一些提示和建议,如何找到并调试这种奇怪行为的原因

编辑:


您是否尝试过对folder.sortedContent进行空检查

通常ReSharper会提示我类似的东西应该有空检查

如果要确定,请在代码中foreach循环上方添加以下行:

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

在你提到的线上:

item = new ListViewItem(file.Name, "Folder")
唯一可能导致NullReferenceException的是如果文件为null,除非从ListViewItem构造函数本身引发异常

您没有提供folder.sortedContent的代码,所以我不知道-但在某些情况下,此集合中的某个元素可能为null吗


如果ListViewItem构造函数引发异常,则需要使用Reflector查看代码,或下载参考源。

我的一位同事刚刚找到了答案。我使用一个线程将ImageList从硬盘加载到ListView,这个线程有时会冻结,如果我分配ImageKey,它就会失败。这并不能解释为什么异常是不可跟踪的,或者为什么它被抛出到这个不可访问的行。但我坚信这就是问题的原因。

这条线并非遥不可及。因为FAFolder派生自FAFile,所以“file is FAFolder”可能会返回true

然而,这意味着文件不是空的,除非它被另一个线程更改


编辑:文件不能被其他线程更改,因为它是本地引用。能否为异常提供堆栈跟踪?这一个现在引起了我的兴趣。

我不禁想知道FAFolder是包含一个“.”还是一个“..”作为父目录和子目录?结果导致排序中断

如果这是不真实的,将相应地编辑此答案

希望这有帮助, 顺致敬意, 汤姆

此异常是否可按需复制? 您能显示异常的堆栈跟踪吗? 引发异常时,还有哪些线程正在运行? 一般来说,有两种方法来调试这类东西。第一种方法是所谓的科学调试:

设计一个理论来解释观察到的行为。 设计一个实验来检验这个理论。 进行实验并观察结果。 第二种方法是逐段剥离实际代码,直到不再触发异常。那么你就有了进一步调查的重要线索

这使我得出结论,execption stacktrace是错误的


通常更容易从假设

如果我们能看到FAFolder和FAFilePosting的代码,会容易得多。堆栈跟踪也会有用。您检查了folder.sortedContent的结果以确保返回您期望的内容吗?您能显示sortedContent吗?我假定这是一个iComparable或类似的?文件不能为null,因为if file是FAFolder。null is对象始终为false,sortedContent始终返回一个新列表。但是让我们假设sortedContent==null,而不是foreach的主体不能被执行。
item = new ListViewItem(file.Name, "Folder")