当集合中的元素太多时抛出哪个异常

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 应抛出:

当参数的值超出被调用方法定义的允许值范围时.

这意味着访问集合大小之外的元素,而不是集合太大时.

还有其他例外情况适合这种情况吗?

Kri*_*ten 6

我会用ArgumentException.

为什么?

这是有问题的论证,而不是Foo类型的对象.问题是由Foo类型的对象引起的,那么InvalidOperationException更合适.

我不会使用ArgumentOutOfRangeException,因为没有允许的ICollections范围.只有当参数(而不是它的Count属性)是IComparable并且它的值低于最小值或高于最大值时,我才会使用此异常.请注意,没有严格的法律规定这是遵循的规则,这对大多数.NET开发人员来说都是直观的.

至少与异常类型同样​​重要的是消息.确保清楚地解释真正的问题是什么.该消息应该针对调用代码的开发人员,而不是最终用户,因为开发人员可以而且应该编写从不抛出此异常的代码.这就是Eric Lippert称之为愚蠢的例外,而Krzysztof Cwalina会称之为使用错误.

最后,不要专注于"方法"这个词.属性具有get方法和set方法.正如其他人所指出的那样,抛出异常的代码在set方法中.


Avi*_*ner 5

我会选择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)