我在其中一个项目网页中有以下代码:
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”文件时,我们得到以下异常:
alt text http://blog.ianmellor.co.uk/images/xml_err.jpg
好到目前为止..但是当我们尝试“继续”或“跳过”时,我希望它会流入catch块。 但是,它没有;我们只是得到死亡的红屏:
alt text http://blog.ianmellor.co.uk/images/xml_err2.jpg
我做错了什么?
答案 0 :(得分:5)
因为你没有写过
xDoc.Load(File.FullName);
在try块内。这就是为什么不处理异常的原因。
答案 1 :(得分:2)
关于将load()放在try块中的另一个答案是正确的,但实际上并没有解释为什么SelectNodes()“出现”抛出一个未被捕获的XmlException。
实际答案是调试器与源代码混淆/不同步,并且实际上显示错误的行导致异常。
它应该指向xDoc.Load(File.FullName); ,在这种情况下,很明显这个调用应该在try块内。
为什么呢?注意堆栈跟踪的最后一行中的XmlLoader.LoadNode()。在.NET Reflector中,您可以看到XmlDocument.Load()方法(深入它的大小)调用LoadNode()方法。
然而,同样在反射器中,可以看出SelectNodes()方法不会在其内部实现中的任何位置调用LoadNode()。
因此,根据堆栈跟踪,异常不能由SelectNodes()引起。
我已经看到调试器在进行代码更改和调试开始之前就像这样混淆,但是调试符号没有正确更新。尝试清理并重新构建解决方案以刷新调试符号。