J.A*_*.L. 10 c# collections exception
我希望我班上的收藏限制为最多6个元素:
public class Foo
{
private ICollection bars;
public ICollection Bars
{
get { return this.bars; }
set
{
if (value != null && value.Count > 6)
{
throw new Exception("A Foo can only have up to 6 Bars."); // Which exception to throw?
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
抛出这种情况的正当例外是什么?
根据文件,ArgumentException应抛出:
当提供给方法的其中一个参数无效时.
但这不是一种方法.
ArgumentOutOfRange 应抛出:
当参数的值超出被调用方法定义的允许值范围时.
这意味着访问集合大小之外的元素,而不是集合太大时.
还有其他例外情况适合这种情况吗?
我会用ArgumentException.
为什么?
这是有问题的论证,而不是Foo类型的对象.问题是由Foo类型的对象引起的,那么InvalidOperationException更合适.
我不会使用ArgumentOutOfRangeException,因为没有允许的ICollections范围.只有当参数(而不是它的Count属性)是IComparable并且它的值低于最小值或高于最大值时,我才会使用此异常.请注意,没有严格的法律规定这是遵循的规则,这对大多数.NET开发人员来说都是直观的.
至少与异常类型同样重要的是消息.确保清楚地解释真正的问题是什么.该消息应该针对调用代码的开发人员,而不是最终用户,因为开发人员可以而且应该编写从不抛出此异常的代码.这就是Eric Lippert称之为愚蠢的例外,而Krzysztof Cwalina会称之为使用错误.
最后,不要专注于"方法"这个词.属性具有get方法和set方法.正如其他人所指出的那样,抛出异常的代码在set方法中.
我会选择ArgumentException(或InvalidOperationException根据@Ramunas的建议).
说明:
关于But this is not a method.声明,在底线,方法和属性之间没有真正的区别.含义:
public ICollection Bars
{
get { return this.bars; }
set
{
if (value != null && value.Count > 6)
{
throw Exception("A Foo can only have up to 6 Bars."); // Which exception to throw?
}
}
}
Run Code Online (Sandbox Code Playgroud)
相当于:
Public ICollection get_Bars()
{
return this.bars;
}
Public ICollection set_Bars(ICollection value)
{
if (value != null && value.Count > 6)
{
throw new Exception("A Foo can only have up to 6 Bars."); // Which exception to throw?
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2993 次 |
| 最近记录: |