为什么.NET中没有ArgumentEmptyException?

And*_*nea 2 .net arguments exception

我开始认为我做错了什么.我的意思是他们确实最终放置了System.String.IsNullOrWhitespace但没有放置ArgumentEmptyException类.

        public FilterItem(string name, IEnumerable<string> extensions)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentNullException("name");
            }
            if (extensions == null)
            {
                throw new ArgumentNullException("extensions");
            }
            if (extensions.Count() == 0)
            {
                throw new ArgumentOutOfRangeException("extensions");
            }

            this.Name = name;
            this.Extensions = extensions;
        }
Run Code Online (Sandbox Code Playgroud)

抛出ArgumentOutOfRangeException感觉不自然.在我看来,ArgumentException的一个实例太笼统了.

我很容易创建一个新的异常类,以这种方式调用它并完成它.让我感到困惑的是,它不在BCL/FCL中,我开始认为有充分的理由不拥有它.

应该有吗?

JSB*_*ոգչ 9

就个人而言,我只是提出ArgumentException并在信息中加入一些信息.这条消息就是为了帮助您在开发过程中诊断出问题 - 实际上并不存在您希望在完成的系统中捕获该错误的任何情况,因此没有理由让它成为唯一的catch.


Joe*_*Joe 5

例如,提起诉讼ArgumentNullException是有先例的。另请参阅此相关问题String.IsNullOrEmptySystem.Windows.Forms.Clipboard.SetText

因此,通过扩展,我认为对 做同样的事情是合理的String.IsNullOrWhitespaceArgumentOutOfRangeException也是一个合理的选择,但就我个人而言,我只会在参数期望比非空更受限制的值范围时使用它。

重用ArgumentNullException(或ArgumentOutOfRangeException) 而不是ArgumentException或 自定义异常类型的优点:

  • ArgumentNullException(and ArgumentOutOfRangeException) 有一个构造函数,它接受string paramName- 所以不需要像您必须的那样生成消息ArgumentException

  • 无需创建自定义异常类型的额外工作。

我看到的唯一缺点是调用者是否需要以与实际null情况不同的方式处理此异常,这对我来说似乎不太可能,并且如果得出逻辑结论将导致明显的矫枉过正:

if (param == null) throw new ArgumentNullException("param");
if (param.Length == 0) throw new ArgumentEmptyException("param");
if (param.Trim().Length == 0) throw new ArgumentWhitespaceException("param");
Run Code Online (Sandbox Code Playgroud)

我通常会选择,这就是我对以下 MSDN 指南的ArgumentNullException解释:

如果您的错误条件可以通过与任何其他现有异常不同的方式进行编程处理,请创建并引发自定义异常。否则,抛出现有异常之一