11

我希望我的类中的集合限制为最多 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应抛出:

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

这是为了访问集合大小之外的元素,而不是当集合太大时。

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

4

3 回答 3

6

我会用ArgumentException.

为什么?

有问题的是参数,而不是 Foo 类型的对象。如果问题是由 Foo 类型的对象引起的,那么 anInvalidOperationException会更合适。

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

至少与异常类型一样重要的是消息。确保清楚地解释真正的问题是什么。该消息应该针对调用代码的开发人员,而不是最终用户,因为开发人员可以并且应该编写永远不会引发此异常的代码。这就是 Eric Lippert 所说的愚蠢异常和 Krzysztof Cwalina 所说的使用错误

最后,不要把注意力集中在“方法”这个词上。一个属性有一个get方法和一个set方法。正如其他人所指出的,引发异常的代码在 set 方法中。

于 2013-10-15T07:50:53.233 回答
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?
      }
    }
  }

相当于:

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?
  }   
}
于 2013-10-15T07:37:48.427 回答
3

如果您对“太大”的含义设置限制,您可以设置一个ConstraintException. 根据文档ConstraintException“表示尝试违反约束的操作时引发的异常。”。希望这可以帮助。

于 2016-08-17T21:22:30.447 回答