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

时间:2013-11-22 21:06:28

标签: c# .net exception constructor

我有一个班级:

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

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

可行的候选人是:

  1. ArgumentNullException
  2. ArgumentException
  3. InvalidOperationException
  4. TypeInitializationException (根据以下的dasblinkenlight不是这样)
  5. 我的直觉是与InvalidOperationException一起使用,因为调用者试图以非法状态构造对象,尽管ArgumentException也有优点。

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

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

3 个答案:

答案 0 :(得分:13)

我认为大多数正确的实现都是这样的:

if (bar == null) { throw new ArgumentNullException (...); }
else if (bar.Trim() == "") { throw new ArgumentException (...); }
但是我们可能会紧张一只蚊子并吞下一头骆驼。这可能不是非常重要。

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

答案 1 :(得分:12)

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

if (bar == null) {
    throw new ArgumentNullException("bar");
}
if (string.IsNullOrWhiteSpace(bar)) {
    throw new ArgumentException("bar");
}

由于您提到了其他例外,以下是它们的含义:

  1. ArgumentNullException - 表示相关参数为null
  2. ArgumentException - 表示相关参数不为空,但无效。
  3. InvalidOperationException - 表示无法在对象的当前状态下执行操作。
  4. TypeInitializationException - 表示无法初始化类型(不是类型的实例,但类型本身)。
  5. 此列表中的前三个例外始终表示调用方的编程问题,即接收它们的调用者知道他们必须修复他们的代码,因为他们正在错误地调用您的API。

    最后一个异常表示您身边存在编程问题,即收到此错误的来电者知道他们必须打电话给您修复错误,或者重新配置他们安装库的方式。

答案 2 :(得分:8)

由于以下原因,

ArgumentException在这里最有意义

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

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