似乎无法处理XMLException?

我在我们的一个项目网页中有以下代码:

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”文件时,我们得到以下exception:

alt text http://blog.ianmellor.co.uk/images/xml_err.jpg

好到目前为止..但是当我们尝试“继续”或“跳过”时,我希望它会流入catch块。 但是,它没有; 我们只是得到死亡的红屏:

alt text http://blog.ianmellor.co.uk/images/xml_err2.jpg

我究竟做错了什么?

这是因为你没有写

 xDoc.Load(File.FullName); 

在try块内。 这就是为什么不处理exception的原因。

将load()放在try块中的另一个答案是正确的,但实际上并没有解释为什么SelectNodes()“出现”抛出一个未被捕获的XmlException。

实际答案是调试器与源代码混淆/不同步,实际上显示错误的行导致exception。

它应该指向xDoc.Load(File.FullName); ,在这种情况下,很明显这个调用应该在try块内。

为什么? 注意堆栈跟踪的最后一行中的XmlLoader.LoadNode()。 在.NET Reflector中,您可以看到XmlDocument.Load()方法(深入它的大小)调用LoadNode()方法。

但是,同样在reflection器中,可以看出SelectNodes()方法不会在其内部实现中的任何位置调用LoadNode()。

因此,根据堆栈跟踪,exception不能由SelectNodes()引起。

我已经看到调试器在进行代码更改和调试开始之前就像这样混淆,但是调试符号没有正确更新。 尝试清理并重新构建解决方案以刷新调试符号。