我有一个简单的方法,它从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;但最终得到无法访问的代码。 如何放弃不构建的字符串,在调用方法中记录失败并转到下一个条目?
答案 0 :(得分:1)
如果您希望得到空值,那么这不是一个例外情况。对于可以获取空值的字段,您需要检查null并将其替换为空字符串或其他一些数据。
例如,您的truncateFunc可以轻松地或基于传递给它的参数轻松处理null情况。
此外,不应该重新抛出异常,而应该只添加一个可以在循环完成后检查的错误集合。这也不是一个例外条件,而是将数据问题收集到某种数组中的标准方法。你可以在循环中完成一个例外,如果你想这样做,但仍然是例外滥用,恕我直言。