似乎无法处理 XMLException?

Posted

技术标签:

【中文标题】似乎无法处理 XMLException?【英文标题】:Can't seem to handle XMLException? 【发布时间】:2010-11-27 03:04:48 【问题描述】:

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

            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

我做错了什么?

【问题讨论】:

已尝试以类似的成功捕获 SystemException、Exception、System.Xml.XmlPath.XPathException.. 出于好奇,将catch(XmlException e) 改为catch 会发生什么? 拉齐:完全一样。抛出红色屏幕 o' 死亡。 【参考方案1】:

那是因为你没有写

xDoc.Load(File.FullName);

在 try 块内。这就是没有处理异常的原因。

【讨论】:

就是这样,谢谢!但是你能解释一下(或指出某处)为什么会这样吗? 只有发生在catch块对应的try块中才能捕获异常。 但是抛出错误的行(.SelectNodes)在try catch中。但我想我现在知道了; XMLDocument 对象是否使用惰性绑定?【参考方案2】:

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

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

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

为什么?请注意堆栈跟踪最后一行中的 XmlLoader.LoadNode()。在 .NET Reflector 中,您可以看到 XmlDocument.Load() 方法(在其内心深处)调用了 LoadNode() 方法。

但是,同样在反射器中,可以看出 SelectNodes() 方法在其内部实现的任何地方都没有调用 LoadNode()。

所以根据堆栈跟踪,异常不可能是由 SelectNodes() 引起的。

我之前看到调试器在进行代码更改并开始调试时会出现这样的困惑,但调试符号尚未正确更新。尝试清理并重新构建您的解决方案以刷新调试符号。

【讨论】:

我已经重新启动,清理了解决方案,重建并重新测试,但它仍然在“错误”行上失败。然而,将线粘贴在 try catch 中并穿过它,它会在“加载”线上中断.. 奇怪

以上是关于似乎无法处理 XMLException?的主要内容,如果未能解决你的问题,请参考以下文章

Web 服务调用导致 System.Xml.XmlException:'.',十六进制值 0x00

System.Xml.XmlException: “=”是意外的标记。标记应为“;”

xsd:包含soapUI中的异常:org.apache.xmlbeans.XmlException:org.apache.xmlbeans.XmlException:错误:null之后的文件意外结束(

XmlException: '"' 是一个意外的标记。预期的标记是 '"' 或 '''

System.Xml.XmlException:缺少根元素[关闭]

System.Xml.XmlException:“':'字符,十六进制值 0x3A,不能包含在名称中。”