0

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

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();
}

我如何正确检查异常处理部分(*),如果XmlFoo是新实例XmlDocument但由于LoadXml()加载/解析错误而出错?

我有两个约束:

  1. 我无法将LoadXML()内部包装起来,XmlException因为所有错误处理都在异常代码中处理。
  2. 我无法XmlException在一般异常之前创建一个,因为在 XmlFoo 解析之前和之后解析了其他 Xml 文件。

仅使用以下内容计算节点的数量是一种安全且不优雅的解决方法吗:

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

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

4

3 回答 3

2

鉴于您可怕的限制,我将最干净的解决方案视为:

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

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

  • 尝试解析前的错误:parsingAttempted为假
  • 解析时出错:parsingAttempted为真,parsingSucceeded为假
  • 解析成功:parsingSucceeded为真
于 2013-04-30T16:02:48.253 回答
1

我只是在这里猜测,但是在阅读了您与 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
   }   .. 
}
于 2013-04-30T15:37:24.693 回答
0

不知道为什么你不能只捕获 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
}
于 2013-04-30T15:10:20.970 回答