此代码检索日志文件的行并尝试在分隔字段之一中查找日期。哪个字符是分隔符可能会有所不同,并且可以在哪个字段中找到日期也会有所不同。它也可以写成不同的日期格式或从 Unix 纪元时间经过的毫秒数。它从列表的底部开始,如果没有找到,它会递归地向上移动,直到没有更多的行可以读取。因此,最简单、最易读的方法(在我看来)是使用嵌套的 try-catch 块,但鉴于它也是一种递归方法,理论上应该会降低性能吗?这是一个糟糕的代码吗?
我可以将一堆 if-else 块与 DateTime.TryParse 一起使用,并为结果添加额外的变量,但这会让我的眼睛流血。代码的可读性是否证明嵌套的 try-catch 块用于流控制?
static DateTime? Search(List<string> lines)
{
if (lines.Count == 0)
{
return null;
}
DateTime? date = null;
string dateField;
try
{
dateField = lines.Last().Split(';')[18].Trim('\'').Trim();
date = DateTime.ParseExact(dateField, "MM'/'dd'/'yy HH:mm:ss", null, DateTimeStyles.AllowWhiteSpaces);
}
catch (Exception)
{
try
{
dateField = lines.Last().Split(';')[19].Trim('\'').Trim();
date = DateTime.ParseExact(dateField, "MM'/'dd'/'yy HH:mm:ss", null, DateTimeStyles.AllowWhiteSpaces);
}
catch (Exception)
{
try
{
dateField = lines.Last().Split(':')[9].Split('=')[1].Trim();
date = FromUnixEpochTime(long.Parse(dateField));
}
catch (Exception)
{
try
{
dateField = lines.Last().Split(':')[12].Split('=')[1].Trim();
date = FromUnixEpochTime(long.Parse(dateField));
}
catch (Exception)
{
try
{
dateField = lines.Last().Split(':')[19].Trim('\'').Trim();
date = DateTime.ParseExact(dateField, "MM'/'dd'/'yy HH", null, DateTimeStyles.AllowWhiteSpaces);
}
catch (Exception)
{
lines.RemoveAt(lines.Count - 1);
date = Search(lines);
}
}
}
}
}
return date;
}