2013-04-17 42 views
1

考虑配置(属性,在我的情况下)为空的情况。Dot Net异常:空引用和参数null异常

public Configuration {get;set;} 

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

但是,我读的地方,“难道没有抛出一个空引用异常在你的代码。NullReferenceException是一个运行时异常,应该只由运行时得到提升”。

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

那么,在这种情况下应该是什么例外?一般来说,在什么情况下应该抛出什么样的例外?谷歌搜索这个,但没有令人满意的答案。

+0

我主要是防止我需要一个属性公开的情况,但可能不是null。但是,如果它是类的重要组成部分,我会将它作为构造函数的参数并在其中引发'ArgumentNullException'。如果(包括那个)你仍然需要它是公开的,当有人将null传递给setter时,我会抛出一个'ArgumentNullException'。但是,现在可能不是这种情况,并且[InvalidOperationException](http://msdn.microsoft.com/en-us/library/system.invalidoperationexception.aspx)是最好的。 – Silvermind

回答

6

InvalidOperationExceptions states - 当方法调用对对象的当前状态无效时引发的异常,我认为这并不合适吗?我同意空引用不是你应该抛出的。

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

+0

感谢您的名单NDJ。怎么样ConfigurationErrorsException? –

+0

ConfigurationErrors - '发生配置系统错误时引发的异常' - 如果由于某些配置错误而不是刚刚未设置,您的属性为空,我可以看到你来自哪里。 – NDJ

+0

因此,ConfigurationErrors基本上意味着配置中发生了一些错误。但是,在我们的例子中,由于配置本身是空的,我们应该抛出InvalidOperationExceptions?它是否正确 ? –

4

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

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

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

4

InvalidOperationException

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

这听起来像你的情况。

基本上,如果它不是参数相关的,并且你想抛出一个内置的异常,你的选择通常会归结为两种例外之一。如果你会从来没有能够兑现请求,NotImplementedException是合适的。但如果这是一个配置或状态的问题,InvalidOperationException符合法案。

3

你应该在什么情况下不要抛出异常。它只在遇到意想不到的情况时才使用,例如尝试为配置设置一些null值。 但是,如果配置可以是null而它的已经是,您应该以其他方式处理它。

2

我觉得其实有三种情况在这里:

首先,能这样呢作为用户类做的事情错误的的结果?他们是否忘记先打电话或设置一些东西(即是否存在他们违反的时间依赖性)?

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

其次,这只能发生是由于类中的逻辑错误吗?换句话说,不管该类的用户如何使用其公共方法和属性,都不可能发生这种情况?

如果是这样的话,如果你使用的是Code Contracts您可以通过声明宣布这是这种情况:

Contract.Assume(configuration != null); 

我觉得这是更好的。然而,违反抛出的异常是不可捕捉的,除非你捕捉到Exception。这是故意的,并且是IMO的正确选择。

如果你不使用代码合同,那么你坚持投掷InvalidOperationException

第三,如果该异常自然就出现了,因为程序的控制的外部因素,你应该如果没有现有的相匹配的问题,为它编写自定义异常类型。但是,对于这个特殊的例子,情况似乎不太可能。我希望它可以在别处处理。