我有一个班级:
class Foo
{
public Foo(string bar)
{
if (string.IsNullOrEmpty(bar))
throw new Exception("bar must not be null or empty.");
}
}
要抛出的最正确的异常类型是什么?
可行的候选人是:
ArgumentNullException
ArgumentException
InvalidOperationException
TypeInitializationException
我的直觉是与InvalidOperationException
一起使用,因为调用者试图以非法状态构造对象,尽管ArgumentException
也有优点。
我希望有StringNullOrEmptyException
,不是很棒吗?
修改 感谢建议的问题,它是类似的,但我特别询问它在构造函数中发生的情况以及是否会改变建议。
答案 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");
}
由于您提到了其他例外,以下是它们的含义:
ArgumentNullException
- 表示相关参数为null
ArgumentException
- 表示相关参数不为空,但无效。InvalidOperationException
- 表示无法在对象的当前状态下执行操作。TypeInitializationException
- 表示无法初始化类型(不是类型的实例,但类型本身)。此列表中的前三个例外始终表示调用方的编程问题,即接收它们的调用者知道他们必须修复他们的代码,因为他们正在错误地调用您的API。
最后一个异常表示您身边存在编程问题,即收到此错误的来电者知道他们必须打电话给您修复错误,或者重新配置他们安装库的方式。
答案 2 :(得分:8)
ArgumentException
在这里最有意义
ArgumentNullException
- >无效,因为字符串可能为空InvalidOperationException
- >它不是失败的操作,它是构造函数中的参数如果你真的想要一个StringNullOrEmptyException
,你可以自己创建它,但大多数人都倾向于同意一个人应该坚持系统定义的例外