当集合中的元素过多时要引发的异常
本文关键字:异常 集合 元素 | 更新日期: 2023-09-27 18:35:18
我希望我的类中的集合限制为最多 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
应扔:
当参数的值超出调用方法定义的允许值范围时。
这是为了访问集合大小之外的元素,而不是在集合太大时。
还有其他例外情况更适合这种情况吗?
我会使用ArgumentException
.
为什么?
有问题的是参数,而不是 Foo 类型的对象。如果问题是由 Foo 类型的对象引起的,那么InvalidOperationException
会更合适。
我不会使用ArgumentOutOfRangeException
,因为没有允许的ICollects范围。仅当参数(而不是其 Count 属性)具有可比性,并且其值低于最小值或高于最大值时,我才会使用此异常。请注意,没有硬性法律将此作为要遵循的规则,这只是大多数 .NET 开发人员感觉直观的规则。
不过,至少与异常类型同样重要的是消息。确保清楚地解释真正的问题是什么。该消息应面向调用代码的开发人员,而不是最终用户,因为开发人员可以并且应该编写永远不会引发此异常的代码。这就是Eric Lippert所说的愚蠢的异常,而Krzysztof Cwalina称之为使用错误。
最后,不要把注意力集中在"方法"这个词上。属性具有 get 方法和 set 方法。正如其他人指出的那样,引发异常的代码位于 set 方法中。
我会选择ArgumentException
(或根据@Ramunas建议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?
}
}
如果要设置对"太大"含义的约束,则可以设置ConstraintException
。根据文档,ConstraintException
"表示尝试违反约束的操作时引发的异常。希望这有帮助。