C# 缺失数据的例外情况

C# 缺失数据的例外情况,c#,exception,C#,Exception,我想知道对于丢失的数据,应该抛出什么样的异常。例如,如果xml节点不包含数据。很容易“抛出新异常(…)”,但不建议这样做。另一个选项是创建一个新的异常类,如MissingDataException或InvalidDataException,但这种情况下没有内置的异常类吗?您可以使用System.Xml.XmlException 编辑:即使System.Xml.xmleexception合适,我认为您应该定义自己的异常,因为它会更精确,并且您可以描述缺少什么类型的数据:id、日期等。不要调用“抛出

我想知道对于丢失的数据,应该抛出什么样的异常。例如,如果xml节点不包含数据。很容易“抛出新异常(…)”,但不建议这样做。另一个选项是创建一个新的异常类,如MissingDataExceptionInvalidDataException,但这种情况下没有内置的异常类吗?

您可以使用
System.Xml.XmlException

编辑:即使
System.Xml.xmleexception
合适,我认为您应该定义自己的异常,因为它会更精确,并且您可以描述缺少什么类型的数据:id、日期等。

不要调用“抛出新异常”,因为您不知道如何处理异常


定义您自己的异常。更具体一些,比如XMLDataMissingException。然后,您可以向用户提供一条微不足道的消息或将其记录下来。

根据经验,在派生您自己的异常之前,请检查现有的.NET framework异常,以查找要抛出的适当异常。为了直接回答您的问题,目前没有可抛出的“缺失数据”异常,但这并不意味着没有合适的异常来覆盖您的情况

在你的情况下,谦逊者可能是合适的;当调用对象上的方法,但对象的状态不适合该操作时,会引发此异常。这方面的示例包括对封闭流调用方法和已通过集合末尾的枚举数。如果XML数据是对象的内部状态,并且方法调用发现了错误的数据,则是一个很好的候选者

如果要将XML数据传递给方法,则可以选择一个或其派生的方法。有一小部分异常,所有这些异常都表明传递给方法的参数与方法预期的不同

只有在希望以不同于其他异常的方式处理异常情况时,才需要创建自定义异常。如果您确实选择创建自己的异常,请确保从高于的异常派生它,以便基类暗示异常的性质。

抛出新异常(“我的消息”);(或其他内置异常)通常是正确的方法。另一种选择是大量的异常类,这些异常类只能使用一次


如果新的异常得到保证,它们应该在域的上下文中创建,而不是在问题的上下文中创建。

根据经验,您应该在异常情况下抛出异常。如果所讨论的数据对对象的状态或行为产生不利影响,则抛出自定义异常。另一种方法可能涉及某种类型的验证器,该验证器触发您的客户机优雅地处理的事件,例如,向最终用户报告错误或插入默认值


我遇到了您描述的类似问题,其中有两个客户端(称为a&B)读取和修改单个xml文件。客户端A删除了节点X,然后客户端B尝试更新节点X。显然,更新不再存在的节点是一个问题。为了解决这个问题,我从SQLServer获得灵感,它报告受UPDATE语句影响的行数。在这个特殊的例子中,我正常地引发了UpdateNode事件,并且受影响的行数属性设置为零

>也有<代码>系统.DATA .ObjutoNoStudioDebug > 类,您可以考虑。

更新:从Entity Framework 6开始,此异常类的完全限定名为
System.Data.Entity.Core.ObjectNotFoundException


有关EF5->EF6命名空间更改的更多详细信息,请参阅。

有关数据丢失的一般情况,其中数据由唯一ID引用,则
KeyNotFoundException
可能是合适的-例如

抛出新的KeyNotFoundException($“找不到键{key}的预期记录”)


它位于
System.Collections.Generic
命名空间中。

+1我百分之百同意,使用系统提供的功能,只有在找不到有效功能时,才能创建自定义异常。可能的候选功能还包括
ValidationException
我不同意ValidationException的想法-如文档所述,这是系统的一部分。活动库和“当Windows工作流基础元素(如活动或工作流)处于无效状态时,将被抛出”微软文档描述了上面的答案:运行时使用Stury.xML.xMLExcExt来指示读取XML文档的错误,特别是XML格式不正确的地方。(例如,未闭合的标记,缺少根元素)。它甚至包括行数和字符数。我觉得不太合适。如果他的XML在节点中有数据,但没有任何数据,在我看来,XML的格式不正确,因此他可以在哪一行显示(如果他需要,甚至可以显示字符数)。我认为这很合适,即使定义他自己的异常会更好。您可能应该定义自定义异常的含义。当您可以返回函数结果表明某些数据丢失时,为什么要抛出异常?该异常是System.data.Entity.dll的一部分,可能会创建不必要的依赖关系。@Stijn当然。这就是我说“您”的原因“可能会考虑”。请使用详细信息设置消息。不,您真的不应该引发一般异常。异常是要处理的,您可能希望以不同的方式处理不同的异常。当您不知道发生异常时该怎么办时,一般异常应该是最后的选择。在此上下文中,SomethingNotFound异常启用“我”会更合适,因为您可能希望尝试在处理程序中创建丢失的数据,如果出现其他异常,您可能不希望这样做。