当集合中有太多元素时,应该抛出哪个异常?

12

我希望我的类中的集合仅限于最多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
使用InvalidOperationException。一般情况下,我会选择自定义异常。 - Ramunas
MSDN几乎为所有异常都提供了一种方法。我不会让这成为你的障碍。我会基于整体描述而不是措辞来做出选择。我也同意Ramunas关于InvalidOperationException的看法——当方法调用对于对象的当前状态无效时抛出的异常 - CodingIntrigue
我认为大多数人建议将setter包装在单独的方法中,因为有额外的逻辑。我认为getter和setter的初衷是非常简单的,因为它们没有任何固有的语义意义。我想我会说我同意这篇帖子:https://dev59.com/3HRB5IYBdhLWcg3wpYio#565227 - rliu
顺便问一下,你是不是想说 throw new Exception - John Saunders
@JohnSaunders 抱歉,我漏掉了那个“new”单词。已经修复了。谢谢。 - J.A.I.L.
3个回答

7

我会使用 ArgumentException

为什么?

问题出在参数上,而不是类型为Foo的对象。如果问题是由类型为Foo的对象引起的,那么使用 InvalidOperationException 更合适。

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

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

最后,不要将重点放在“方法”这个词上。属性有一个get方法和一个set方法。抛出异常的代码位于set方法中,正如其他人所指出的。


5
我建议使用 ArgumentException (或根据@Ramunas的建议使用InvalidOperationException)。 解释:
关于“但这不是一个方法”的说法,实际上,方法和属性之间没有真正的区别。
 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?
  }   
}

3
如果您对“太大”的定义进行了限制,您可以设置 ConstraintException 。根据文档 ConstraintException 表示“尝试违反约束时引发的异常。”希望这有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接