Dot Net Exceptions:空引用和参数null异常

时间:2013-04-17 07:03:14

标签: c# .net visual-studio-2010 .net-4.5

考虑配置(在我的情况下属性)为空的情况。

public Configuration {get;set;}

if (configuration == null)
{
   throw NullReferenceException("Blah blah blah..");
}

但是,我在某处读到,“不要在代码中抛出空引用异常。NullReferenceException是运行时异常,只应由运行时引发”。

如果它是函数的参数,我想我会使用ArgumentNullException

那么,在这种情况下应该是什么例外?总的来说,在什么情况下应该抛出什么例外?用Google搜索但没有令人满意的答案。

5 个答案:

答案 0 :(得分:6)

InvalidOperationExceptions个状态 - 当方法调用对于对象的当前状态无效时抛出的异常,我认为这不是一个错误的选择?我同意空引用不是你应该扔的。

here's另一个常见例外列表。

答案 1 :(得分:4)

建议是正确的,因为空引用异常并没有说明实际上有什么错误。

如果该值不允许为null,那么您应该尝试查找描述错误的异常。问题不在于引用是null,而是引用为空的潜在原因。

如果找不到足够接近的任何异常类,您可以创建自己的ConfigurationMissingException异常。

答案 2 :(得分:4)

InvalidOperationException

  

当方法调用对象的当前状态无效时引发的异常。

听起来像你的情况。

基本上,如果它与参数无关,并且您想抛出内置异常,那么您的选择通常会归结为两个例外中的一个。如果您永远不会能够接受请求,则NotImplementedException是合适的。但如果它是配置或状态问题,InvalidOperationException符合要求。

答案 3 :(得分:3)

在什么情况下你不应该抛出异常。它只会在发生意外情况时使用,例如您尝试为Configuration配置一些null值。 但是,如果配置可以是null已经,那么您应该以其他方式处理它。

答案 4 :(得分:2)

我认为这里实际上有三种情况:

首先,这可能是由于班级的用户错误地执行了吗?他们是否忘记先打电话或设置一些东西(即是否存在违反的时间依赖性)?

如果是这样,那么我认为适当的例外是InvalidOperationException,其中Message描述了如何解决问题,或者您可能想要指定代码合同,如下所述。

其次,这是否只会因类中的逻辑错误而发生?换句话说,无论班级用户如何使用其公共方法和属性,是否不可能发生这种情况?

如果是这样,那么如果您使用Code Contracts,您可以通过声明:

来声明这种情况。
Contract.Assume(configuration != null);

我发现这要好得多。但是,除了捕获Exception之外,违规引发的异常是无法捕获的。这是故意的,也是正确的选择IMO。

如果你没有使用代码合同,那么你就会被抛弃InvalidOperationException

第三,如果由于程序控制之外的外部因素而自然出现此异常,则应该为它编写自定义异常类型(如果没有匹配问题的现有异常类型)。但是,对于这个特定的例子,似乎不太可能出现这种情况。我希望它可以在其他地方处理。