在.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框架之外的其他问题的好答案,请发布!
答案 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()函数中),应该抛出异常,并且消息指示函数因属性无效而失败。