Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对于意外的空值,我应该引发什么异常?_C#_Exception_Exception Handling - Fatal编程技术网

C# 对于意外的空值,我应该引发什么异常?

C# 对于意外的空值,我应该引发什么异常?,c#,exception,exception-handling,C#,Exception,Exception Handling,我已经做了十多年的.NET开发人员,所以这里有一个我不知道答案的可耻问题。我明白了——如果参数为null,我可以抛出ArgumentNullException。如果我尝试取消引用空值,将引发NullReferenceException 但是,如果我有如下代码: var someVitalObject = someServiceReference.GetVitalObject(); if (someVitalObject == null) { throw new IDontKnowWhatE

我已经做了十多年的.NET开发人员,所以这里有一个我不知道答案的可耻问题。我明白了——如果参数为null,我可以抛出ArgumentNullException。如果我尝试取消引用空值,将引发NullReferenceException

但是,如果我有如下代码:

var someVitalObject = someServiceReference.GetVitalObject();

if (someVitalObject == null)
{
  throw new IDontKnowWhatException(); // what exception should I throw here?
}

现在,对于服务来说,这不一定是一个问题,因为它应该在前面抛出一个异常。

我会抛出一个异常。或者,如果您对此不满意,您可以从中派生出一种更专门的空引用异常类型,用于您自己的目的。

很难说没有看到更多的上下文,但也许

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


考虑创建您自己的
Exception
类,该类继承自
ApplicationException
Exception

public sealed class MyException : Exception
{
    ...
}

因此,您将能够控制存储在其中的信息类型。

我仅在直接检查方法参数时使用System.ArgumentNullException,而不是在验证某个调用的结果时使用

我抛出的异常类型在很大程度上取决于上下文。但在这种情况下,我可能会选择自定义异常,如:

public class VitalObjectNotAcquiredException : Exception { ... }

我通常对传递到函数中的对象使用ArgumentNullException。任何其他与null相关的内容,我使用InvalidOperationException。在特殊情况下,如果有必要,我将创建一个自定义异常。

个人而言,我将根据GetVitalObject方法契约进行选择。如果这个方法应该返回一个NOTNULL对象,我会对它进行更改,这样在这种情况下它就会抛出一个异常


如果您无法控制该方法,或者如果返回null值是正确的(但不是在您的上下文中),我会使用Mark和Dmitry已经说过的自定义异常。

NullReferenceException?这是null,是执行流中的错误吗?这会导致你的应用程序终止吗?也许更多的上下文可以帮助我们更好地理解这个问题。
GetVitalObject()
是否违反了它的约定,或者返回null是否有效,但在这种情况下就不是了?API是否保证了对象是否可以为null?如果是这样,可能更多的是断言失败(使用Trace.Assert)。否则,像VitalObjectNotFoundException这样的自定义异常将是合适的。在我的例子中,为了使它更简单,假设我正在检查缓存的状态,以查看它是否存储了“重要对象”。到那时应该是这样的,如果没有,那就是一个问题。不,这通常是取消引用空引用的结果。这基本上表明你没有进行足够的检查。基本上,我会在我的日志中发现一个误导性的异常。抛出一个
NullReferenceException
将是非常误导的。我认为你不应该自己抛出一个。NullReferenceException更像是一种指示,表明您在使用它之前忘了自己检查一些东西是否为null。将NRE留给运行时,因为它指出了一个开发错误。它通常是方法参数的
ArgumentNullException
,或者其他更详细的异常exception@roryap:我不知道你所说的“已解除引用的引用”是什么意思,或者你所说的“访问空引用”是什么意思。当您有
foo.Bar
时,这就是取消引用
foo
的值。。。因此,如果
foo
null
,则会引发异常。在这种情况下,OP没有取消引用
null
引用-他只是发现它是null。通常,从
ApplicationException
继承被认为是一种错误做法@juharr is purple==错误做法?:ApplicationException不被认为是有害的,只是没用。我想我认为捕获
ApplicationException
是一种不好的做法。