Не можете справиться с XMLException? - PullRequest
5 голосов
/ 10 сентября 2009

У меня есть следующий код на одной из наших веб-страниц:

            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(File.FullName);

            //work through each print batch in this queue file
            try
            {
                XmlNodeList nodeList = xDoc.SelectNodes("Reports/PrintBatch");
                foreach (XmlNode printBatch in nodeList)//xDoc.SelectNodes("Reports/PrintBatch"))
                {
                    PrintBatch batch = new PrintBatch();
                    batch.LoadBatch(printBatch, File.Extension);
                    this.AddBatch(batch);
                }
            }
            catch (XmlException e)
            {
                //this report had an error loading!
                Console.WriteLine(e.Message);
            }

В основном он принимает пакетный файл xml и загружает его как объект, готовый к обработке.

Это работало нормально до недавнего времени, когда один из файлов XML был обнаружен с нулевым символом (который недопустим в XML).

Когда он пытается обработать этот файл "dudd", мы получаем следующее исключение:

альтернативный текст http://blog.ianmellor.co.uk/images/xml_err.jpg

Хорошо, пока ... но когда мы тогда попытаемся "продолжить" или "перешагнуть", я ожидаю, что это попадет в блок catch. Однако это не так; мы просто получаем красный экран смерти:

альтернативный текст http://blog.ianmellor.co.uk/images/xml_err2.jpg

Что я делаю не так?

Ответы [ 2 ]

5 голосов
/ 10 сентября 2009

Это потому, что вы не написали

xDoc.Load(File.FullName);

внутри блока try. По этой причине исключение не было обработано.

2 голосов
/ 10 сентября 2009

Другой ответ о размещении Load () внутри блока try является правильным, но на самом деле не объясняет, почему SelectNodes () «создает» исключение XmlException, которое не перехватывается.

Фактический ответ заключается в том, что отладчик запутан / не синхронизирован с вашим исходным кодом и фактически показывает неправильную строку как причину исключения.

Это действительно должно указывать на xDoc.Load (File.FullName); , в этом случае будет ясно, что этот вызов должен быть внутри блока try.

Почему? Обратите внимание на XmlLoader.LoadNode () в последней строке трассировки стека. В .NET Reflector вы можете видеть, что метод XmlDocument.Load () (в глубине его недр) вызывает метод LoadNode ().

Однако и в отражателе видно, что метод SelectNodes () не вызывает LoadNode () нигде во внутренней реализации.

Таким образом, согласно трассировке стека, исключение не могло быть вызвано SelectNodes ().

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...