似乎无法处理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()引起。
我已经看到调试器在进行代码更改和调试开始之前就像这样混淆,但是调试符号没有正确更新。 尝试清理并重新构建解决方案以刷新调试符号。