Xai*_*oft 3 c# exception-handling
假设你读了一个大的XML文件,大约25%的节点是可选的,所以你真的不在乎它们是否在那里,但是,如果它们被提供给你,你仍然会读它们并做一些事情与他们(例如存储在数据库中).
因为它们是可选的,所以在这种情况下将它们包装在空try . . . catch块中是不行的,所以如果它们不在那里,程序就会继续执行?你不关心抛出错误或类似的东西.
请记住,仅仅因为它们是可选的并不意味着您不想检查它们.它只是意味着向您提供XML的人不希望您知道某些信息,或者他们确实希望您知道,并且由您来处理它.
最后,如果这只是几个节点,那就不是什么大问题了,但是如果你有100个节点是可选的,那么检查每个节点是null第一个还是停止执行如果null找到一个节点可能会很痛苦因此我之所以问这是否是空的try catch语句的正当理由.
如果处理节点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)
| 归档时间: |
|
| 查看次数: |
453 次 |
| 最近记录: |