我有一个看起来如下的类:
public class StackOverflowQuestion {
private string _question;
public string Question {
get { return _question; }
set { _question = value; }
}
public StackOverflowQuestion(string question) {
_question = question;
}
public override string ToString() {
return _question;
}
}
现在,值“question”不允许为 null 或空,并且应该通过 ArgumentNullException 通知用户 - 但是应该将它扔到哪里呢?根据“快速失败”原则 -> 无处不在。
public class StackOverflowQuestion {
private string _question;
public string Question {
get { return _question; }
set {
if(!String.IsNullOrEmpty(value))
_question = value
else throw new ArgumentNullException("value");
}
}
public StackOverflowQuestion(string question) {
if(!String.IsNullOrEmpty(question))
_question = question;
else throw new ArgumentNullException("question");
}
public override string ToString() {
if(!String.IsNullOrEmpty(_question)) return _question;
else throw new ArgumentNullException("_question");
}
}
现在这显然是荒谬的,而且极其重复。但这似乎是正确的:如果该值是通过 .ctor 设置的,则在短暂检查后直接失败。当它通过属性设置时,它在短暂检查后直接失败..但是谁期望设置器出现异常?当我输出字符串时,我期待一个字符串,而不是早就应该发生的事情的例外,但同样:如果它错了,它应该尽快失败,即使“很快”已经很晚了。
那么,唯一的异常处理应该在哪里进行呢?我是在要求“最佳实践”,还是这是一种品味?