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