考虑配置(在我的情况下属性)为空的情况。
public Configuration {get;set;}
if (configuration == null)
{
throw NullReferenceException("Blah blah blah..");
}
但是,我在某处读到,“不要在代码中抛出空引用异常。NullReferenceException
是运行时异常,只应由运行时引发”。
如果它是函数的参数,我想我会使用ArgumentNullException
。
那么,在这种情况下应该是什么例外?总的来说,在什么情况下应该抛出什么例外?用Google搜索但没有令人满意的答案。
答案 0 :(得分:6)
InvalidOperationExceptions个状态 - 当方法调用对于对象的当前状态无效时抛出的异常,我认为这不是一个错误的选择?我同意空引用不是你应该扔的。
here's另一个常见例外列表。
答案 1 :(得分:4)
建议是正确的,因为空引用异常并没有说明实际上有什么错误。
如果该值不允许为null,那么您应该尝试查找描述错误的异常。问题不在于引用是null,而是引用为空的潜在原因。
如果找不到足够接近的任何异常类,您可以创建自己的ConfigurationMissingException
异常。
答案 2 :(得分:4)
当方法调用对象的当前状态无效时引发的异常。
听起来像你的情况。
基本上,如果它与参数无关,并且您想抛出内置异常,那么您的选择通常会归结为两个例外中的一个。如果您永远不会能够接受请求,则NotImplementedException
是合适的。但如果它是配置或状态问题,InvalidOperationException
符合要求。
答案 3 :(得分:3)
在什么情况下你不应该抛出异常。它只会在发生意外情况时使用,例如您尝试为Configuration配置一些null
值。
但是,如果配置可以是null
且已经,那么您应该以其他方式处理它。
答案 4 :(得分:2)
我认为这里实际上有三种情况:
首先,这可能是由于班级的用户错误地执行了吗?他们是否忘记先打电话或设置一些东西(即是否存在违反的时间依赖性)?
如果是这样,那么我认为适当的例外是InvalidOperationException
,其中Message
描述了如何解决问题,或者您可能想要指定代码合同,如下所述。
其次,这是否只会因类中的逻辑错误而发生?换句话说,无论班级用户如何使用其公共方法和属性,是否不可能发生这种情况?
如果是这样,那么如果您使用Code Contracts,您可以通过声明:
来声明这种情况。Contract.Assume(configuration != null);
我发现这要好得多。但是,除了捕获Exception
之外,违规引发的异常是无法捕获的。这是故意的,也是正确的选择IMO。
如果你没有使用代码合同,那么你就会被抛弃InvalidOperationException
。
第三,如果由于程序控制之外的外部因素而自然出现此异常,则应该为它编写自定义异常类型(如果没有匹配问题的现有异常类型)。但是,对于这个特定的例子,似乎不太可能出现这种情况。我希望它可以在其他地方处理。