如何在不使用XmlException的情况下检查XmlDocument实例上的LoadXml()是否出错

本文关键字:实例 LoadXml 出错 是否 XmlDocument 情况下 XmlException 检查 | 更新日期: 2023-09-27 18:11:27

我必须修复一些代码,看起来像这样:

XmlDocument XmlFoo = null;
try{
    SomeUntrappedWCFCalls();
    SomeUntrappedStringParsing();
    SomeUntrappedXMLParsing();
    ..
    XmlFoo = new XmlDocument();
    XmlFoo.LoadXml(SomeXml);
    ..
    SomeUntrappedWCFCalls();
    SomeUntrappedStringParsing();
    SomeUntrappedXMLParsing();
}
(Exception ex){
      CodeThatDealsWithPartOfTheExceptionsRaisedAbove(); 
      ..
      //Need to check if the LoadXml() went wrong
      ..
      CodeThatDealsWithPartOfTheExceptionsRaisedAbove();
}

我怎么能正确检查异常处理节(*),如果XmlFooXmlDocument的新实例,但LoadXml()出错了加载/解析错误?

我有两个约束:

  1. 我不能在XmlException中包装LoadXML(),因为所有的错误处理都在Exception代码中处理。
  2. 我不能在一般异常之前创建XmlException,因为在XmlFoo解析之前和之后解析了其他Xml文件。

仅仅计算节点的数量是一种安全而不优雅的解决方法吗?

if (XmlFoo.ChildNodes.Count == 0){..

或者我是否需要一些其他变量以某种方式检查LoadXML()解析状态?

如何在不使用XmlException的情况下检查XmlDocument实例上的LoadXml()是否出错

考虑到您可怕的约束条件,我认为最干净的解决方案是:

bool parsingAttempted = false;
bool parsingSucceeded = false;
try
{
    XmlFoo = new XmlDocument();
    parsingAttempted = true;
    XmlFoo.LoadXml(SomeXml);
    parsingSucceeded = true;
}

现在你可以检查三种情况:

  • 解析前错误:parsingAttempted是false
  • 解析错误:parsingAttempted为真,parsingSucceeded为假
  • 解析成功:parsingSucceeded为真

我只是猜测,但在阅读了您与Jon Skeet的评论后,也许像这样简单的东西可以帮助您:

XmlDocument XmlFoo = null;
bool loading = false;
try{
    ..
    XmlFoo = new XmlDocument();
    loading = true;
    XmlFoo.LoadXml(SomeXml);
    loading = false;
    ..
}
catch (Exception ex){
   if(loading)
   {
      //something went wrong while loading XML
   }   .. 
}

不知道为什么不能捕获XmlException,看看这个:

XmlDocument XmlFoo = null;
try
{
    XmlFoo = new XmlDocument();
    XmlFoo.LoadXml(SomeXml);
}
(XmlException ex)
{
    // Loadxml went wrong
}
(Exception ex)
{
    // Some other Error
}

或者你也可以使用:

XmlDocument XmlFoo = null;
try
{
    XmlFoo = new XmlDocument();
    XmlFoo.LoadXml(SomeXml);
}
(Exception ex)
{
    if(ex is XmlException)
        // LoadXml Error
    else
        // Some other Error
}