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

时间:2013-10-15 07:24:53

标签: c# exception collections

我希望我班上的收藏限制为最多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将被抛出:

  

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

用于访问集合大小之外的元素,而不是在集合太大时。

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

3 个答案:

答案 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;。希望这会有所帮助。