缺少数据的例外情况

时间:2009-09-21 07:15:40

标签: c# exception

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

7 个答案:

答案 0 :(得分:55)

根据经验,检查现有的.NET框架异常,以便在派生自己的异常之前抛出合适的异常。要直接回答您的问题,目前没有可用的“缺失数据”异常,但这并不意味着没有合适的例外来涵盖您的情况。

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

如果要将XML数据传递给方法,ArgumentException或其衍生产品之一可能是合适的选择。这些异常中有一小部分,都表明传递给方法的参数不是预期的方法。

当您希望以与其他异常不同的方式处理异常情况时,您只想创建自定义异常。如果您确实选择创建自己的异常,请确保从比Exception更高的异常派生它,以便基类隐含异常的性质。

答案 1 :(得分:16)

您可以考虑<span id="status-val" class="value"> <span class=" jira-issue-status-lozenge aui-lozenge jira-issue-status-lozenge-yellow jira-issue-status-lozenge-indeterminate jira-issue-status-lozenge-max-width-medium" data-tooltip="&lt;span class=&quot;jira-issue-status-tooltip-title&quot;&gt;In Progress&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;jira-issue-status-tooltip-desc&quot;&gt;This issue is being actively worked on at the moment by the assignee.&lt;/span&gt;">In Progress</span></span> 课程。

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

有关EF5-&gt; EF6命名空间更改的详细信息,请参阅this question

答案 2 :(得分:8)

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

定义您自己的例外。更具体,例如XMLDataMissingException。然后,您可以向用户提供一个有用的消息或记录它。

答案 3 :(得分:2)

您可以使用System.Xml.XmlException

编辑:即使System.Xml.XmlException适合,我认为您应该定义自己的例外,因为它会更精确,您可以描述缺少哪种数据:id,日期等。

答案 4 :(得分:2)

对于一般丢失数据的情况,该数据由唯一ID引用,则if-else可能是合适的-例如

KeyNotFoundException

它在throw new KeyNotFoundException($"Expected record for key {key} not found.");命名空间中。

答案 5 :(得分:1)

根据经验,您应该在特殊情况下抛出异常。如果有问题的数据对对象的状态或行为产生负面影响,则抛出自定义异常。另一种方法可能涉及某种验证器,它会触发客户端正常处理的事件,例如,将错误报告给最终用户或插入默认值。

我遇到了类似的问题,我在其中有2个客户端(称为A&amp; B)读取和修改单个xml文件。客户端删除节点X然后客户端B尝试更新节点X.显然,更新不再存在的节点是一个问题。为了解决这个问题,我从SQL Server中获取灵感,它报告了受UPDATE语句影响的行数。在这种特殊情况下,我正常引发了UpdateNode事件,并将受影响的行数设置为零。

答案 6 :(得分:-6)

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

如果需要新的例外,则应在域的上下文中创建它们,而不是问题。