纠正传递给构造函数的空\null字符串的异常

Ban*_*San 17 .net c# constructor exception

我有一节课:

class Foo
{
    public Foo(string bar)
    {
        if (string.IsNullOrEmpty(bar))
            throw new Exception("bar must not be null or empty.");
    }
}
Run Code Online (Sandbox Code Playgroud)

什么是最正确的异常类型?

可行的候选人是:

  1. ArgumentNullException
  2. ArgumentException
  3. InvalidOperationException
  4. TypeInitializationException (不是按照下面的dasblinkenlight)

我的本能是InvalidOperationException随着调用者试图以非法状态构造对象,但ArgumentException也有优点.

我希望有一个StringNullOrEmptyException,那不是很棒吗?

编辑 感谢您提出的问题,它是类似的,但我特别询问它在构造函数中发生的情况以及是否会改变建议.

Mik*_*oud 14

我想最正确的实现是这样的:

if (bar == null) { throw new ArgumentNullException (...); }
else if (bar.Trim() == "") { throw new ArgumentException (...); }
Run Code Online (Sandbox Code Playgroud)

但是我们可能会紧张一只蚊子并吞下一头骆驼.这可能不是非常重要.

另一方面,您可以构建StringNullOrEmptyException类.

  • 我同意它可能有点过于迂腐,但它却在嘲笑我.了解我,它将继续这样做几天(**咳嗽**周) (3认同)

das*_*ght 13

处理这种情况的一种非常常见的方法是抛出两个不同的异常 - 一个用于null,另一个用于无效的非空字符串:

if (bar == null) {
    throw new ArgumentNullException("bar");
}
if (string.IsNullOrWhiteSpace(bar)) {
    throw new ArgumentException("bar");
}
Run Code Online (Sandbox Code Playgroud)

既然你提到了其他例外,这就是它们的含义:

  1. ArgumentNullException - 表示有问题的参数是 null
  2. ArgumentException - 表示有问题的参数不为空,但无效.
  3. InvalidOperationException - 表示无法在对象的当前状态下执行操作.
  4. TypeInitializationException - 表示无法初始化类型(不是类型的实例,但类型本身).

此列表中的前三个异常始终指示调用方的编程问题,即接收它们的调用方知道它们必须修复其代码,因为它们正在错误地调用您的API.

最后一个异常表示您的编程问题,即接收此错误的调​​用者知道他们必须打电话给您修复错误,或重新配置他们安装库的方式.


Dav*_*ton 8

ArgumentException 由于以下原因,这里最有意义

  • ArgumentNullException - >无效,因为字符串可能为空
  • InvalidOperationException - >它不是失败的操作,它是构造函数中的参数

如果你真的想要一个StringNullOrEmptyException,你可以自己创建它,但大多数人倾向于同意一个人应该坚持系统定义的例外