我正在清理一些旧代码,发现有一些方法明确地抛出了NullReferenceException
(例如:当检查类的某些属性或检查配置是否为空时)。由于 CLR 在引用为空的情况下抛出此类型的异常,因此此类异常似乎是应用程序显式抛出的非常糟糕的选择。
我的问题是 - 从代码中显式抛出NullReferenceException
是否有任何好处呢?
我正在清理一些旧代码,发现有一些方法明确地抛出了NullReferenceException
(例如:当检查类的某些属性或检查配置是否为空时)。由于 CLR 在引用为空的情况下抛出此类型的异常,因此此类异常似乎是应用程序显式抛出的非常糟糕的选择。
我的问题是 - 从代码中显式抛出NullReferenceException
是否有任何好处呢?
NullReferenceException
的文档表明,您不应该从应用程序中抛出它:
请注意,应用程序抛出ArgumentNullException异常,而不是在此处讨论的NullReferenceException异常。
我确信在其他地方看到过指导(目前找不到->在这里https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/using-standard-exception-types),要避免抛出运行时抛出的异常类型(尽管我即将链接到显示运行时抛出“应用程序”异常的内容)。
似乎不适合方法调用的错误状态符合此定义。当调用方法失败的原因不是无效参数时,会使用 InvalidOperationException。
不,没有理由抛出 NullReferenceException
异常。
您总是有关于错误原因的更多信息,因此应该抛出传达该信息的异常。
例如,如果您在不允许的情况下将空引用作为参数,则应抛出 ArgumentException
或 ArgumentNullException
异常。
NullReferenceException
。 ArgumentNullException
或 InvalidOperationException
是有效的替代方案。我假设如果代码没有检查,你会得到一个 NullReferenceException(NRE),所以不需要。然而,我认为在应用程序消息中加入更好地解释特定函数调用机制的信息,并将内部异常类型设置为 NRE 或 ArgumentExecption 是没有问题的,因为这是导致问题的根本原因。
我能想象出一些情况,明确地抛出异常是有意义的。首先想到的是,在 CLR 遇到异常之前,可以在进行大量其他处理之前检查属性。