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)
什么是最正确的异常类型?
可行的候选人是:
ArgumentNullExceptionArgumentExceptionInvalidOperationExceptionTypeInitializationException我的本能是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类.
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)
既然你提到了其他例外,这就是它们的含义:
ArgumentNullException - 表示有问题的参数是 nullArgumentException - 表示有问题的参数不为空,但无效.InvalidOperationException - 表示无法在对象的当前状态下执行操作.TypeInitializationException - 表示无法初始化类型(不是类型的实例,但类型本身).此列表中的前三个异常始终指示调用方的编程问题,即接收它们的调用方知道它们必须修复其代码,因为它们正在错误地调用您的API.
最后一个异常表示您的编程问题,即接收此错误的调用者知道他们必须打电话给您修复错误,或重新配置他们安装库的方式.
ArgumentException 由于以下原因,这里最有意义
ArgumentNullException - >无效,因为字符串可能为空InvalidOperationException - >它不是失败的操作,它是构造函数中的参数如果你真的想要一个StringNullOrEmptyException,你可以自己创建它,但大多数人倾向于同意一个人应该坚持系统定义的例外
| 归档时间: |
|
| 查看次数: |
18701 次 |
| 最近记录: |