显式抛出NullReferenceException的原因是什么?

7

我正在清理一些旧代码,发现有一些方法明确地抛出了NullReferenceException(例如:当检查类的某些属性或检查配置是否为空时)。由于 CLR 在引用为空的情况下抛出此类型的异常,因此此类异常似乎是应用程序显式抛出的非常糟糕的选择。

我的问题是 - 从代码中显式抛出NullReferenceException是否有任何好处呢?


可能不会,我们会检查参数并有时会抛出ArgumentNullException,但这对于参数和参数很好,对于属性就不确定了... - Davide Piras
6个回答

9

NullReferenceException的文档表明,您不应该从应用程序中抛出它:

请注意,应用程序抛出ArgumentNullException异常,而不是在此处讨论的NullReferenceException异常。

我确信在其他地方看到过指导(目前找不到->在这里https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/using-standard-exception-types),要避免抛出运行时抛出的异常类型(尽管我即将链接到显示运行时抛出“应用程序”异常的内容)。


如果您在方法内检查属性,然后再继续,听起来您可能想将它们替换为 InvalidOperationException

当调用方法失败的原因不是无效参数时,会使用 InvalidOperationException。

似乎不适合方法调用的错误状态符合此定义。

5

不,没有理由抛出 NullReferenceException 异常。

您总是有关于错误原因的更多信息,因此应该抛出传达该信息的异常。

例如,如果您在不允许的情况下将空引用作为参数,则应抛出 ArgumentExceptionArgumentNullException 异常。


2

MSDN上说:

请注意,应用程序抛出的是ArgumentNullException异常,而不是这里讨论的NullReferenceException异常。

所以你的问题的答案可能是“不可以”。


2
不,只有框架本身才会引发 NullReferenceExceptionArgumentNullExceptionInvalidOperationException 是有效的替代方案。

1
在这种情况下不应使用NotSupportedException:"对于有时对象可以执行请求的操作,且对象状态确定是否可以执行操作的情况,请参阅InvalidOperationException。 - Damien_The_Unbeliever

1

我假设如果代码没有检查,你会得到一个 NullReferenceException(NRE),所以不需要。然而,我认为在应用程序消息中加入更好地解释特定函数调用机制的信息,并将内部异常类型设置为 NRE 或 ArgumentExecption 是没有问题的,因为这是导致问题的根本原因。


0

我能想象出一些情况,明确地抛出异常是有意义的。首先想到的是,在 CLR 遇到异常之前,可以在进行大量其他处理之前检查属性。


这些情况下不应该使用ArgumentNullException吗? - Dave Hogan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接