неуловимое исключение из недоступного кода - PullRequest
3 голосов
/ 18 февраля 2010

Я сталкиваюсь с очень странной проблемой в моем приложении C # 2.0 WinForms, и я даже не уверен, стоит ли спрашивать SO, потому что проблема возникает в странной установке, и я не думаю, что вы могли бы воспроизвести ее без моегоисточники, но у меня совершенно нет идей.

У меня есть форма с TreeView слева и ListView справа.TreeView показывает все доступные файлы и подпапки из определенной папки (которая содержит документы, которые мне нужны для моего приложения).Если выбрана папка, ListView показывает все файлы и подпапки из выбранной папки.При запуске я заполняю папку TreeView из папки и затем выбираю первый TreeNode по коду (в моем случае это папка).После этого содержимое TreeView выглядит следующим образом:

-folder
   -file1
   -file2

Выбор папки запускает AfterSelecedEvent из TreeView.Поскольку папка была выбрана, я заполняю 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 или нет, но там не было нулевых ссылок.Или, если я добавлю 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);
    }
}

Ответы [ 6 ]

0 голосов
/ 18 февраля 2010
  • Воспроизводится ли это исключение по требованию?
  • Можете ли вы показать трассировку стека исключения?
  • Какие еще потоки запускаются при возникновении исключения?

В общем, есть два способа отладки такого типа вещей. Первый способ - это так называемая «научная» отладка:

  1. Разработать теорию для объяснения наблюдаемого поведения.
  2. Разработать эксперимент для проверки теории.
  3. Запустите эксперимент и наблюдайте за результатами.

Второй способ заключается в урезании фактического кода по частям, пока исключение больше не сработает. Тогда у вас есть существенная подсказка для дальнейшего расследования.

Это подводит меня к выводу, что трассировка стека выполнения неправильна ...

Обычно легче начать, предполагая, что проблема в вашем собственном коде .

0 голосов
/ 18 февраля 2010

Я просто не могу не задаться вопросом, содержит ли FAFolder символ '.'или '..' для родителя и подкаталога?и сортировка прерывается в результате?

Этот ответ будет соответственно отредактирован, если это окажется неверным?

Надеюсь, это поможет, С уважением, Том.

0 голосов
/ 18 февраля 2010

Эта строка не является недоступной. Поскольку FAFolder является производным от FAFile, возможно, что «file is FAFolder» вернет true.

Однако это будет означать, что файл не является нулевым, если только он не изменяется другим потоком.

Редактировать : файл не может быть изменен другим потоком, так как это локальная ссылка. Можете ли вы предоставить трассировку стека для исключения? Это меня сейчас заинтриговало.

0 голосов
/ 18 февраля 2010

Мой коллега только что нашел ответ (возможно).Я использую поток, чтобы загрузить ImageList в ListView с жесткого диска, и этот поток иногда зависает, и если я назначаю ImageKey, это не удается.Это не ответ, почему исключение невозможно отловить или почему оно выдается в этой (недоступной) строке.Но я твердо верю, что это является причиной проблемы.

0 голосов
/ 18 февраля 2010

В строке вы упоминаете:

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

единственное, что может вызвать исключение NullReferenceException, это если file равно нулю (если исключение не выдается из самого конструктора ListViewItem).

Вы не предоставляете код для folder.sortedContent, поэтому я не могу сказать - но возможно ли, что один из элементов в этой коллекции может быть нулевым при определенных обстоятельствах?

Если конструктор ListViewItem выдает исключение, вам нужно будет использовать Reflector для просмотра кода или загрузить справочный источник.

0 голосов
/ 18 февраля 2010

Вы пробовали нулевую проверку на folder.sortedContent?

Обычно ReSharper подсказывает мне, что что-то подобное должно иметь нулевую проверку.

Если вы хотите быть уверены, добавьте следующую строку в ваш код над циклом foreach:

if (folder.sortedContent == null) throw new Exception("It was null, dangit!");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...