C# 点网异常:空引用和参数空异常

C# 点网异常:空引用和参数空异常,c#,.net,visual-studio-2010,.net-4.5,C#,.net,Visual Studio 2010,.net 4.5,考虑配置(在我的例子中是属性)为null的情况 但是,我在某个地方读到,“永远不要在代码中抛出null引用异常。null引用异常是一个运行时异常,应该只由运行时引发” 如果它是函数的参数,我想我会使用ArgumentNullException 那么,在这种情况下有什么例外呢?一般来说,在什么情况下应该抛出什么异常?谷歌搜索了这个问题,但没有令人满意的答案。这个建议是正确的,因为空引用异常并没有说明实际的错误 如果不允许该值为null,则应尝试查找描述错误的异常。问题不在于引用为null,而在于引

考虑配置(在我的例子中是属性)为null的情况

但是,我在某个地方读到,“永远不要在代码中抛出null引用异常。
null引用异常
是一个运行时异常,应该只由运行时引发”

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


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

这个建议是正确的,因为空引用异常并没有说明实际的错误

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

public Configuration {get;set;}

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

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

该建议是正确的,因为空引用异常不会说明实际的错误

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

public Configuration {get;set;}

if (configuration == null)
{
   throw NullReferenceException("Blah blah blah..");
}
如果您找不到任何足够接近的异常类,例如,您可以创建自己的
configurationmissingeexception
exception。

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

这听起来像你的处境

基本上,如果它与参数无关,并且您想要抛出一个内置异常,那么您的选择通常归结为两个异常之一。如果您永远无法满足该请求,
NotImplementedException
是合适的。但如果是配置或状态问题,
invalidooperationexception
符合要求。

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

这听起来像你的处境

基本上,如果它与参数无关,并且您想要抛出一个内置异常,那么您的选择通常归结为两个异常之一。如果您永远无法满足该请求,
NotImplementedException
是合适的。但是,如果是配置或状态的问题,
invalidoOperationException
符合要求。

说明-当方法调用对对象的当前状态无效时引发的异常,我想这不是不合适的吗?我同意空引用不是您应该抛出的

另一个常见异常列表。

状态-当方法调用对对象的当前状态无效时引发的异常,我想这是一个不错的匹配?我同意空引用不是您应该抛出的


另一个常见异常列表。

在什么情况下不应抛出异常。它仅在发生意外情况时使用,例如您尝试将某些
null
值设置为配置。
但是,如果配置可以是空的,并且已经是空的,那么您应该用另一种方式来处理它。

在这种情况下,您不应该抛出异常。它仅在发生意外情况时使用,例如您尝试将某些
null
值设置为配置。
但是,如果配置可以是空的,并且已经是空的,那么您应该用另一种方式来处理它。

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

首先,是否会因为类的用户做错事而发生这种情况?他们是否忘记先调用或设置某个对象(即,他们是否违反了时间依赖)

如果是这样,那么我认为合适的异常是
invalidooperationexception
,带有描述如何解决问题的
消息,或者您可能希望指定如下所述的代码约定

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

如果是,那么如果您正在使用,您可以声明如下:

Contract.Assume(configuration != null);
我觉得这样好多了。但是,由冲突引发的异常是不可跟踪的,除非您捕获了
exception
。这是深思熟虑的,也是正确的选择

如果您没有使用代码契约,那么您将不得不抛出
invalidoOperationException


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

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

首先,是否会因为类的用户做错事而发生这种情况?他们是否忘记先调用或设置某个对象(即,他们是否违反了时间依赖)

如果是这样,那么我认为合适的异常是
invalidooperationexception
,带有描述如何解决问题的
消息,或者您可能希望指定如下所述的代码约定

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

如果是,那么如果您正在使用,您可以声明如下:

Contract.Assume(configuration != null);
我觉得这样好多了。但是,冲突引发的异常是不可捕获的