我在我们的一个项目网页上有以下代码:
            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
我做错了什么?
发布于 2009-09-10 10:20:39
那是因为你还没有写
xDoc.Load(File.FullName);在try块中。这就是未处理异常的原因。
发布于 2009-09-10 14:07:52
关于将Load()放在try块中的另一个答案是正确的,但实际上并没有解释为什么SelectNodes()“似乎”抛出了一个未被捕获的XmlException。
实际的答案是调试器与您的源代码混淆/不同步,并且实际上显示了导致异常的错误行。
它应该真正指向xDoc.Load(File.FullName);,在这种情况下,很明显这个调用应该在try块内。
为什么?注意堆栈跟踪最后一行中的XmlLoader.LoadNode()。在.NET反射器中,您可以看到XmlDocument.Load()方法(在其内部)调用LoadNode()方法。
但是,同样在反射器中,可以看到SelectNodes()方法在其内部实现中的任何地方都不调用LoadNode()。
因此,根据堆栈跟踪,异常不可能是由SelectNodes()引起的。
我以前见过这样的调试器,当代码更改并开始调试时,但调试符号没有正确更新。请尝试清理并重新生成解决方案,以刷新调试符号。
https://stackoverflow.com/questions/1404447
复制相似问题