在下面的示例代码中,我将获取字符串列表并将它们连接到分隔字符串。当我使用带有空列表的setter时会出现问题。 ToString方法抛出ArgumentOutOfRangeException,因为第二个参数是-1。
如何处理这样的条件(getter / setter中抛出的异常)?
我不喜欢setter抛出异常的事实,因为调用者不知道类的内部,因此不应该处理(甚至不知道如何)异常。捕获getter / setter中的所有异常并安静地处理它们听起来也是一个坏主意,因为调用者不会知道getter / setter失败。
//I realize that this isn't the best code but I wanted to produce an example
//to demonstrate my question.
private string theStringVariable;
const string DELIMITER = ",";
public IList<string> StringList
{
set
{
StringBuilder stringBuilder = new StringBuilder();
foreach(string entry in value)
{
stringBuilder.Append(entry);
stringBuilder.Append(DELIMITER);
}
theStringVariable = stringBuilder.ToString(0, stringBuilder.Length - 1);
}
}
答案 0 :(得分:6)
您应该检查潜在的常见错误情况,并在前面抛出您自己的异常(在StringBuilder错误之前),并提供有意义的错误消息。
在您的情况下,如果使用空字符串列表调用setter,您很可能希望使用某种形式的ArgumentException。这里的关键是你的异常可以说“参数包含一个空集合”而不是“索引越界”,这将使调用者立即理解为什么他们在调用中遇到“真正的”问题。 / p>
侧面说明:在您发布的代码的情况下 - 我也考虑将其作为方法而不是属性。你在这个属性设置器中做了很多“工作”,这有些出乎意料。通过使这个方法,你将给用户一个线索,在这个属性中发生一些“处理”......
答案 1 :(得分:1)
我不认为您的问题涉及最佳做法。
您需要注意的最佳做法是
stringBuilder.ToString(0, stringBuilder.Length - 1);
通过不检查字符串长度导致抛出异常。如果您的长度为0,则只返回空字符串。
如果我们正在谈论一般性,如果你能够围绕常见问题,空集,格式错误的数据进行编码,那么你应该尽力保护用户免受不必要的错误。
然而*有时候突然/大声失败会更好,然后就会无声地失败。
答案 2 :(得分:0)
首先,如果您能发现可能导致异常的人 - 修复它以便不会发生异常。在这种情况下,请在循环之前检查空列表并适当设置变量。
否则,捕获异常(您期望可能发生的异常(*)),抛出一个新的更合适的异常(原始作为内部异常)
(*)只抓住你期望的那个 - 让意想不到的一个冒泡到用户身上。
答案 3 :(得分:0)
Code Complete建议您是否可以在本地处理异常:“不要使用异常来传递降压”。在给出的示例中,这将意味着检查空值并在setter中适当地处理它。