为何XNode.AddAfterSelf抛出“父节点缺失”InvalidOperationException而非NullReferenceException
异常触发原因
你混淆了两种完全不同的空场景:
- 你注释的测试代码中,调用
AddAfterSelf的test变量本身就是null,此时CLR在调用实例方法前就会直接抛出NullReferenceException,根本不会进入AddAfterSelf的方法内部。 - 业务代码中抛出的
InvalidOperationException,是因为调用AddAfterSelf的XElement实例本身不是null,但该节点没有挂载到任何父节点上。此时方法可以正常执行,内部逻辑检测到父节点为null后,就会抛出文档标注的异常,和你测试的空引用场景完全无关。
问题排查方向
你代码中触发异常的位置是parent[index - 1].Element.AddAfterSelf(item.Element),说明你从IOrderedList中拿到的parent[index-1]对应的Element是游离节点,从未被挂载到XML树中,或是之前被从XML树中移除后没有同步更新IOrderedList的内容。
你可以在调用AddAfterSelf前增加校验逻辑验证这个判断:
var targetNode = parent[index - 1].Element; // 输出结果为true即可确认是节点无父节点的问题 Console.WriteLine(targetNode.Parent == null);
确认后只需排查IOrderedList中存储的条目对应的Element失去父节点的原因即可,常见原因是某处调用了XNode.Remove()方法移除了XML树中的节点,但没有同步删除或更新IOrderedList中的对应条目。
内容的提问来源于stack exchange,提问作者Chuck Savage
相关产品推荐
相关产品推荐

