尝试在循环中捕获 ArgumentNullException,记录并继续
Try Catch ArgumentNullException in loop, log and continue
我有一个简单的方法,它从 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 条目可能 return 为空。这表明基础数据存在问题,但不应成为阻碍。我想传递失败条目的记录 ID,但我想继续。这不是那样做的。正在捕获 NullException,但 return sb.ToString() 仍然导致失败。我需要什么?我查看了 'finally' 和 'continue',但最终得到的是无法访问的代码。
我如何放弃未构建的字符串,在调用方法中记录失败并继续下一个条目?
如果您希望得到空值,那么这不是例外情况。对于可以获取空值的字段,您需要检查空值并将其替换为空字符串或其他一些数据。
例如,您的 truncateFunc 可以轻松地处理 null 情况,无论是隐式地还是基于传递给它的参数。
此外,您不应重新抛出异常,而应将其添加到错误集合中,以便在循环完成后对其进行检查。这也不是例外情况,而是将数据问题收集到某种数组中的标准方法。当你在循环中完成时,你可以抛出一个异常,如果你想那样做,但这仍然是异常滥用,恕我直言。
我有一个简单的方法,它从 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 条目可能 return 为空。这表明基础数据存在问题,但不应成为阻碍。我想传递失败条目的记录 ID,但我想继续。这不是那样做的。正在捕获 NullException,但 return sb.ToString() 仍然导致失败。我需要什么?我查看了 'finally' 和 'continue',但最终得到的是无法访问的代码。 我如何放弃未构建的字符串,在调用方法中记录失败并继续下一个条目?
如果您希望得到空值,那么这不是例外情况。对于可以获取空值的字段,您需要检查空值并将其替换为空字符串或其他一些数据。
例如,您的 truncateFunc 可以轻松地处理 null 情况,无论是隐式地还是基于传递给它的参数。
此外,您不应重新抛出异常,而应将其添加到错误集合中,以便在循环完成后对其进行检查。这也不是例外情况,而是将数据问题收集到某种数组中的标准方法。当你在循环中完成时,你可以抛出一个异常,如果你想那样做,但这仍然是异常滥用,恕我直言。