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