在循环中尝试Catch ArgumentNullException,记录并继续

时间:2015-03-21 21:03:45

标签: c# error-handling

我有一个简单的方法,它从WebService获取人员信息,并使用StringBuilder构建格式化的字符串。

public List<string> Process(data)
{
  List<string> returnVal = new List<string>();
  foreach (var entry in AggregrateRecords(data))
  {
     try
     {
       var personEntry = FormatRepository.FormatForSB(entry);
       personResult.Append(posgresEntry);
       personResult.Append(";");
       personResult.Append(Environment.NewLine);
     }
     catch (Exception ex)
     {
        _logger.Error("String for entry failed.", ex);
     }
  }
      returnVal.Add(personResult.ToString());
}

public static string FormatForSB(PersonEntry entry)
{
    StringBuilder sb = new StringBuilder();
    try
    {
        Func<string, int, string> truncateFunc =
                (val, length) => !string.IsNullOrEmpty(val) && val.Length > length ? val.Substring(0, length) : val;
        sb.AppendFormat("{0,-13}", truncateFunc(entry.City, 13));
        sb.AppendFormat("{0,-2}", truncateFunc(entry.State, 2));
        sb.AppendFormat("{0,-5}", truncateFunc(entry.Zip, 5));
        sb.AppendFormat("{0,-1}", truncateFunc(Regex.Replace(entry.HomePhone, @"[^\d]", ""), 10));
     } catch  (ArgumentNullException ex) {
        ex.Data.Add("Entry", entry.ID);
        throw ex;        
    }
    return sb.ToString();
    }
}

对于Zip或Gender,条目可能会返回null。这表明基础数据存在问题,但不应该是显示阻止。我想传递失败的条目的记录ID,但我想继续。这不是那样做的。正在捕获NullException,但返回sb.ToString()仍然导致失败。我在这需要什么?我终于看了一眼&#39;并且&#39;继续&#39;但最终得到无法访问的代码。 如何放弃不构建的字符串,在调用方法中记录失败并转到下一个条目?

1 个答案:

答案 0 :(得分:1)

如果您希望得到空值,那么这不是一个例外情况。对于可以获取空值的字段,您需要检查null并将其替换为空字符串或其他一些数据。

例如,您的truncateFunc可以轻松地或基于传递给它的参数轻松处理null情况。

此外,不应该重新抛出异常,而应该只添加一个可以在循环完成后检查的错误集合。这也不是一个例外条件,而是将数据问题收集到某种数组中的标准方法。你可以在循环中完成一个例外,如果你想这样做,但仍然是例外滥用,恕我直言。