处理属性的set/get中的异常

bra*_*mus 1 c# exception-handling

在下面的示例代码中,我将获取字符串列表并将它们连接到分隔的字符串.当我使用带有空列表的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);
   }
}
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 6

您应该检查潜在的常见错误条件,并在前面抛出您自己的异常(在StringBuilder错误之前),并提供有意义的错误消息.

在您的情况下,如果使用空字符串列表调用setter,您很可能希望使用某种形式的ArgumentException.这里的关键是你的异常可以说"参数包含一个空集合"而不是"索引越界",这将使调用者立即理解为什么他们在调用中遇到"真正的"问题.


在旁注:在你发布的代码的情况下 - 我也考虑将其作为方法而不是属性.你在这个属性设置器中做了很多"工作",这有些出乎意料.通过使这个方法,你将给用户一个线索,在这个属性中发生一些"处理"......

  • 更好的理由使它成为一种方法:它似乎是一种"只写"属性.这很少是一个好主意. (6认同)