我希望我班上的收藏限制为最多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?
}
}
}
}
在这种情况下扔什么是正确的例外?
根据文件,ArgumentException
将被抛出:
当提供给方法的其中一个参数无效时。
但这不是一种方法。
ArgumentOutOfRange
将被抛出:
当参数的值超出被调用方法定义的允许值范围时。
用于访问集合大小之外的元素,而不是在集合太大时。
还有其他例外情况适合这种情况吗?
答案 0 :(得分:6)
我会使用ArgumentException
。
为什么?
它是有问题的论证,而不是Foo类型的对象。问题是由Foo类型的对象引起的,那么InvalidOperationException
会更合适。
我不会使用ArgumentOutOfRangeException
,因为没有允许的ICollections范围。只有当参数(而不是它的Count属性)是IComparable并且它的值低于最小值或高于最大值时,我才会使用此异常。请注意,没有严格的法律规定这是遵循的规则,它对大多数.NET开发人员来说都是直观的。
至少与异常类型同样重要的是消息。确保清楚地解释真正的问题是什么。该消息应该针对调用代码的开发人员,而不是最终用户,因为开发人员可以而且应该编写从不抛出此异常的代码。这是Eric Lippert称之为boneheaded exception而Krzysztof Cwalina称之为usage error的内容。
最后,不要专注于"方法"。属性具有get方法和set方法。正如其他人所指出的那样,抛出异常的代码在set方法中。
答案 1 :(得分:5)
根据@Ramunas的建议,我会选择ArgumentException
(或InvalidOperationException
)。
<强>解释强>
关于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?
}
}
}
相当于:
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?
}
}
答案 2 :(得分:3)
如果你要对什么&#34;太大&#34;设置限制?意思是,您可以设置ConstraintException
。根据{{3}},ConstraintException
&#34;表示尝试违反约束的操作时引发的异常。&#34;。希望这会有所帮助。