При чтении this recent question об необработанном XmlException я попытался воспроизвести его в консольном приложении .NET 2.0 и 3.5.Странное необработанное поведение XmlException
Однако в моем коде он ведет себя точно так, как ожидалось, метод XmlDocument.Load генерирует исключение XmlException, потому что исходный XML-файл содержит символ NULL.
Итак, почему оператор Load в следующем коде (из этого примера) не выбрал исключение XmlException? Более того, почему XmlException не обрабатывается действительным блоком try, окружающим вызов метода SelectNodes()?
Хотя я догадываюсь, что внутри может быть какая-то ленивая загрузка/кеширование, не такое поведение очень неинтуитивное и запутанное?
(Ранее вопрос ясно показывает скриншот отладчика жалуясь, что SelectNodes() бросил в XmlException, но что это необработанное ???)
XmlDocument xDoc = new XmlDocument();
xDoc.Load(File.FullName);
//work through each print batch in this queue file
try
{
// This line throws an XmlException but is not handled by the catch!
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);
}
Вы выглядите правильно. Я проверил реализацию Load и SelectNodes в Reflector, и он появляется только Load вызывает XmlLoader.LoadNode() (как показано в трассировке стека). Поэтому символы отладки могут быть не синхронизированы с показанным кодом. – Ash