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