c#为什么不抛出ArgumentNullException?

时间:2011-10-17 15:39:53

标签: c# exception

我刚刚阅读here我不应该从我自己的源代码中抛出ArgumentNullException。这是为什么?

如果我有一个不应该传递null的方法,为什么不检查参数并抛出它是否确实为空?

public void DoStuff(List<Int32> list)   // Shouldn't be null.
{
   if(list == null)   // If input is null...
      throw new ArgumentNullException();

   ...
}

感谢。

5 个答案:

答案 0 :(得分:6)

该引用没有说任何这样的事情(我找不到该页面上提到的ArgumentNullException)。它确实说不抛出NullReferenceException,这是一个完全不同的异常,并且确实不应该从你自己的代码抛出(你没有理由)。

我一直从自己的代码中抛出ArgumentNullException,检查参数时.NET Framework也是如此。

答案 1 :(得分:3)

当然你应该。事件你自己的链接有这个例子作为第一个。如果该方法是公开的,则应始终检查参数有效性。

该链接仅讨论NullReferenceException,这仅在您尝试访问null引用对象的方法时才会发生。不抛出NullReferenceExceptions是正确的,因为它们仅由运行时抛出。

答案 2 :(得分:3)

抛出ArgumentNullException没有错,这是一个很好的做法。

文章讨论的是System.Exception,System.SystemException,System.NullReferenceException或System.IndexOutOfRangeException

答案 3 :(得分:1)

因为如果你抛出一个* NullReferenceException * ,这意味着你预料到其中一个对象可以对它自己有一个空引用。将逻辑编程到代码中处理这个问题会更好,而不是依赖异常来处理它。

不应将异常用于更改程序的流程,作为普通执行的一部分。它们只应用于报告和处理错误情况。

答案 4 :(得分:1)

如果可以使用null参数的默认值,并且只要明确记录默认值,那么可能值得考虑该选项。

但是,您应始终验证公共方法中的任何参数。不要相信其他开发人员知道他们在做什么。由于无效参数而抛出的任何异常都应从ArgumentException类继承。