这是空的try catch块的情况吗?

Xai*_*oft 3 c# exception-handling

假设你读了一个大的XML文件,大约25%的节点是可选的,所以你真的不在乎它们是否在那里,但是,如果它们被提供给你,你仍然会读它们并做一些事情与他们(例如存储在数据库中).

因为它们是可选的,所以在这种情况下将它们包装在空try . . . catch块中是不行的,所以如果它们不在那里,程序就会继续执行?你不关心抛出错误或类似的东西.

请记住,仅仅因为它们是可选的并不意味着您不想检查它们.它只是意味着向您提供XML的人不希望您知道某些信息,或者他们确实希望您知道,并且由您来处理它.

最后,如果这只是几个节点,那就不是什么大问题了,但是如果你有100个节点是可选的,那么检查每个节点是null第一个还是停止执行如果null找到一个节点可能会很痛苦因此我之所以问这是否是空的try catch语句的正当理由.

Ser*_*rvy 5

如果处理节点X是可选的,那么您的代码应该类似于:

if(node X exists in file)
{
  do work with X
}
Run Code Online (Sandbox Code Playgroud)

并不是:

try
{
  do work with X
}
catch{}
Run Code Online (Sandbox Code Playgroud)

现在如果没有办法确定节点X是否存在而不是尝试使用它,或者如果在检查它是否存在之后可以删除节点X,那么你将被迫使用try/catch模型.这不是这里的情况.(相反,在阅读文件之前检查文件是否存在;有人可以在检查文件是否存在后将其删除.)

-------------------------------------------------- ----------

编辑:

因为看起来您的问题是仅在以下XML中访问节点"孙子",其中"父"可能不存在.(请原谅我在SO中呈现此XML的能力差;知识渊博的读者可以自由地以适当的格式进行编辑.)

<root>
  <Parent>
    <Child>
      <GrandChild>
        The data I really want.
      </GrandChild>
    </Child>
  </Parent>
</root>
Run Code Online (Sandbox Code Playgroud)

为此,我会做这样的事情:

public static class XMLHelpers
{
public static Node GetChild(this Node parent, string tagName)
{
  if(parent == null) return null;
  return parent.GetNodeByTagName(tagName);
}
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

var grandbaby = rootNode.GetChild("Parent").GetChild("Child").GetChild("GrandChild");
if(grandbaby != null)
{
  //use grandbaby
}
Run Code Online (Sandbox Code Playgroud)