似乎无法处理 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: '"' 是一个意外的标记。预期的标记是 '"' 或 '''