Операторы 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);
                }
            }
Другие вопросы по тегам