当集合中的元素过多时要引发的异常

本文关键字:异常 集合 元素 | 更新日期: 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"表示尝试违反约束的操作时引发的异常。希望这有帮助。