ArgumentException vs. ArgumentNullException?

本文关键字:ArgumentNullException vs ArgumentException | 更新日期: 2023-09-27 18:17:31

我正在重构一些代码,并添加一个方法来替换(即将)废弃的方法。新方法具有以下签名:

FooResult Foo(FooArgs args) { ... }

已弃用的方法包含越来越多的参数列表。这些参数现在是FooArgs类的属性。已弃用的方法有几个保护条件,它们使用以下结构检查空值:

if (parameter1 == null)
    throw new ArgumentNullException(“parameter1”);
if (parameter... == null)
    throw new ArgumentNullException(“parameter...”);
if (parameterN == null)
    throw new ArgumentNullException(“parameterN”);

现在,参数已经崩溃到FooArgs类,我应该抛出一个ArgumentNullExceptionFooArgs参数的个别属性:

if (args.Property1 == null)
    throw new ArgumentNullException(“args.Property1”);
if (args.Property... == null)
    throw new ArgumentNullException(“args.Property...”);
if (args.PropertyN == null)
    throw new ArgumentNullException(“args.PropertyN”);

或者为整个 FooArgs参数抛出一个更通用的ArgumentException:

if (args.Property1 == null)
    throw new ArgumentException(“Property1 cannot be null.”, “args”);
if (args.Property... == null)
    throw new ArgumentException(“Property... cannot be null.”, “args”);
if (args.PropertyN == null)
    throw new ArgumentException(“Property2 cannot be null.”, “args”);

谢谢!

ArgumentException vs. ArgumentNullException?

您需要添加一个检查参数本身是否为非空。ANE不适合单独的组件,所以您需要使用更通用的AE,像这样:

if (args == null)
    throw new ArgumentNullException(“args”);
if (args.Property1 == null)
    throw new ArgumentException(“Property1 cannot be null.”, “args”);
if (args.Property... == null)
    throw new ArgumentException(“Property... cannot be null.”, “args”);
if (args.PropertyN == null)
    throw new ArgumentException(“Property2 cannot be null.”, “args”);

虽然我完全同意dasblinkenlight的回答,但您可能还想考虑将FooArgs的验证移到FooArgs类本身中。如果这个类是专门设计用来移动参数的,那么它的null属性可能是无效的,在这种情况下,我将允许它的构造函数执行验证。

在这种情况下,最好检查该方法内部的FooArgs参数是否为空引用,如果传入了空引用,则抛出ArgumentNullException。然后,如果其他方法或代码段使用了args类中包含的参数,则应该由它们来检查并在必要时抛出异常。但是,如果接受args类的方法是使用所有参数的方法,那么最好像您建议的那样检查该方法中的有效参数。

同样,ArgumentNullException只用于null引用的参数。如果它只是一个无效值(例如一个空字符串),那么您应该使用更通用的ArgumentException

这取决于您的工具以及您对工具的看法(resharper, fxcops等)。一些静态代码分析工具接受这个:

throw new ArgumentNullException(“args.Property...”,"args");

,拒绝

throw new ArgumentNullException(“args.Property...”,"args.Property");

因此,如果您想使用工具,那么针对参数属性的空值断言必须抛出ArgumentException

你也可以边走边编。无论向维护开发人员传达正确的消息,以帮助他正确地传递参数,都是正确的消息。

相关文章:
  • 没有找到相关文章