Этот код извлекает строки файла журнала и пытается найти дату в одном из разделенных полей. Какой символ является разделителем, он может меняться, а также в каком поле можно найти дату. Он также может быть записан в разных форматах дат или в миллисекундах с момента времени Unix. Он начинается со дна списка, и если он не найден, он возвращается к рекурсивно, пока не будет больше строк для чтения. Итак, самый простой и наиболее читаемый способ сделать это (на мой взгляд) - это использовать вложенные блоки try-catch, но учитывая, что это также рекурсивный метод, теоретически должен давать более низкую производительность? Это плохой код?Является ли удобочитаемость кода оправданием вложенных блоков 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;
}
Прежде всего, вы не должны улавливать общие типы исключений, например 'Exception' – MarcinJuraszek
. Вам действительно стоит рассмотреть возможность поиска в TryParse и TryParseExact, которые облегчат большую часть ваших забот об исключениях. –