Операторы Net Core Catch с другой бизнес-логикой в файлах анализа
Я пишу простую программу для разбора текстового файла и помещения в общий список.
Пример текста:
1,Joe,CA,58,2
2,Matt,TX,63,5
Иногда может быть ошибка с отсутствующими данными в файле
1,Joe,CA,58 // missing one number
2,Matt,TX,63,5
Я написал Catch Statement для обработки ошибок. В конце концов, Заказчику необходим файл, с строкой которого возникла ошибка.
Мой принцип программного обеспечения Вопрос в том, должны ли операторы catch использоваться для обработки другой бизнес-логики, в случае ошибки, или она должна использоваться только для возбуждения исключений? В этом операторе catch я создаю папку с ошибкой и файл с данными, вызвавшими проблему. Это уместно? См. Заявление Catch ниже.
-
public class CustomerData
{
public int CustomerId { get; set; }
public string CustomerName { get; set; }
public string CustomerState { get; set; }
public int ProductId { get; set; }
public int QuantityBought { get; set; }
}
public List<CustomerData> GetCustomer(string filename)
{
List<CustomerData> customerdata = new List<CustomerData>();
string CustomerBase = filename;
String fileToLoad = String.Format(CustomerBase);
using (StreamReader r = new StreamReader(fileToLoad))
{
string line;
while ((line = r.ReadLine()) != null)
{
string[] parts = line.Split(',');
// Skip the column names row
if (parts[0] == "id") continue;
try
{
CustomerData dbp = new CustomerData
{
CustomerId = Convert.ToInt32(parts[0]),
CustomerName = parts[1],
CustomerState = parts[2],
ProductId = Convert.ToInt32(parts[3]),
QuantityBought = Convert.ToInt32(parts[4]),
};
customerdata.Add(dbp);
}
catch
{
Console.WriteLine("Parse Error!");
string ErrorFolderPath = @"C:\Users\Desktop\Parsefile\ErrorFile";
string ErrorFile = System.IO.Path.Combine(ErrorFolderPath, Path.GetFileName(filename));
bool FolderExists = System.IO.Directory.Exists(ErrorFolderPath);
if (!FolderExists)
System.IO.Directory.CreateDirectory(ErrorFolderPath);
bool ErrorFileExists = System.IO.File.Exists(ErrorFile);
if (!ErrorFileExists)
System.IO.File.Create(ErrorFile);
using (TextWriter tw = new StreamWriter(ErrorFile))
{
tw.WriteLine(line);
}
}
}
}
return customerdata;
}
2 ответа
Нет, это не правильно. В вашем catch{}
заблокировать, вы должны логически вести логирование, и повторное выдвижение исключения (ИЛИ) в зависимости от требований вашей системы может повторить ту же операцию. Но не рекомендуется использовать такую другую обработку, как создание папки или файлов, поскольку, если эти операции завершатся неудачей (по какой-то причине), они не будут перехвачены, и ваше приложение будет некорректно зависать.
Спасибо за совет, я прекратил использовать любой Logger, Nlog это частный случай. Дайте мне знать, если это правильные стандарты кодирования. Или не стесняйтесь комментировать.
while ((line = r.ReadLine()) != null)
{
string[] parts = line.Split(',');
// Skip the column names row
if (parts[0] == "id") continue;
try
{
CustomerData dbp = new CustomerData
{
CustomerId = Convert.ToInt32(parts[0]),
CustomerName = parts[1],
CustomerState = parts[2],
ProductId = Convert.ToInt32(parts[3]),
QuantityBought = Convert.ToInt32(parts[4]),
};
customerdata.Add(dbp);
}
catch (Exception ex)
{
logger.Error(ex, "Got exception.");
logger.Info(line);
}
}