应该从Property Set抛出什么异常?

时间:2008-12-31 18:04:50

标签: .net language-agnostic exception

在.NET中,如果有人将非法值传递给属性的set { }部分,应该抛出什么类型的异常?

示例:

public string Provider
{
    get { return _provider; }
    set
    {
        if (String.IsNullOrEmpty(value)) throw new Exception("Provider cannot be null or empty."); //what type of exception should be thrown here instead?
        _provider = value;
    }
}

注意:

我问这个问题,因为它适用于.NET,但它也适用于许多其他语言。因此,如果您有一个适用于.NET框架之外的其他问题的好答案,请发布!

4 个答案:

答案 0 :(得分:7)

ArgumentException,ArgumentOutOfRangeException,ArgumentNullException或类似内容。

答案 1 :(得分:1)

一般来说,我不同意Jon B关于何时抛出异常 - 如果它在调用set()时被抛出,它将捕获设置无效值的上下文。另一方面,如果您只是将其设置为某个虚拟值并将异常抛出到其他位置,那么根据您采用的方法,客户端将看到虚拟值而不表示这不是实际设置的值,或者它们是将收到一个例外,该例外不会让他们知道谁应对无效状态负责或如何纠正它。

现在在某些情况下这种技术可能有意义 - 如果由于某些不可避免的原因,该属性极易变形,并且您已经确定可以暂时设置非法属性,但(基于某些外部同步)客户端在知道属性是合法且稳定的值之前,不允许检索该属性。这也不是很好,但我确信你可能会遇到无法帮助这种情况的情况。

既然你问过.NET以外的语言,在Java中我会在一般情况下使用IllegalArgumentException - 如果参数为null,可能是一个很好的旧NullPointerException。

答案 2 :(得分:1)

我同意Andrzej。应该在“set”中抛出异常,因为不应将属性设置为无效值,并且需要“捕获设置无效值的上下文”

我使用ArgumentException类之一,因为“引擎盖下”“set”是对自动创建的方法的调用,名为'CLASSNAME'.set_'PROPERTYNAME'(值)

例如

class MyClass
{
  string name;

  public string Name {
    get {
      return name;
    }
    set {
      if (value==null) {
        throw new ArgumentNullException("value", "The value of the property Name cannot be set to null.");
      }
      name = value;
    }
  }

}

在内部,这会创建两个方法

public string get_Name()

public void set_Name(string value)

如果显示堆栈跟踪,则会抛出异常。

这就是为什么我总是在消息中包含类似“属性Name ...的值”的文本,以便属性的用户可以看到抛出异常的位置,因为没有一个名为set_SOMEPROPERTY的方法(SOMETYPE值) )对类库的用户可见。

(此外,根据“.NET Framework 4 - 异常,捕获和抛出标准异常类型设计指南”(Here),您可能会这样做。 在“ArgumentException,ArgumentNullException和ArgumentOutOfRangeException”下的页面大约一半处,它声明“使用值作为属性setter的隐式值参数的名称”)

答案 3 :(得分:0)

在这种情况下,我不会抛出异常。如果属性是字符串,那么我可以将其设置为“”或null。当我尝试使用该属性时(例如在Connect()函数中),应该抛出异常,并且消息指示函数因属性无效而失败。