Как я могу сохранить кучу исключений и затем вернуть их как ответ веб-API? - PullRequest
0 голосов
/ 01 декабря 2019

Итак, я пытаюсь импортировать кучу данных из Excel в БД в моем Web Api, эти данные проверяются с использованием FluentValidation , проблема в том, что каждый раз, когда я сталкиваюсь сневерная информация из таблицы Excel, мой код перестает работать, и API возвращает исключение.

Я хотел бы сохранить все эти исключения, оставить мой код работающим до конца таблицы Excel, а затем после этого вернуть всеисключения как мой ответ API. Я также думаю, что было бы неплохо возвратить, в какой строке таблицы произошло исключение.

Мой код выполняется внутри оператора for для каждого оператора, поэтому для сохранения строки в произошедших ошибках я могу просто запуститьсчетчик внутри него.

Что касается поддержания моего кода в рабочем состоянии, я могу запустить его внутри Try-Catch (или будет ли лучший способ?), Но внутри него я могу хранить все исключения togueter, чтобы потом возвращать их позже

Ответы [ 3 ]

2 голосов
/ 01 декабря 2019

Большинство компонентов .NET, которые могут возвращать несколько исключений, используют AggregateException для достижения этой цели. Общий шаблон для этого будет:

var exceptions = new List<Exception>();

foreach (var w in work)
{
    try
    {
        DoWork(w);
    }
    catch (Exception e)
    {
        exceptions.Add(e);
    }
}

if (exceptions.Any())
{
    throw new AggregateException(exceptions);
}

Вот документы для AggregateException.

1 голос
/ 01 декабря 2019

проблема в том, что каждый раз, когда я получаю строку с неверной информацией из таблицы excel, мой код перестает работать, а API возвращает исключение.

Продолжение процесса послеисключение никогда не было хорошей идеей. В лучшем случае то, с чем вы работаете, теперь находится в недопустимом состоянии и будет выдавать больше исключений «InvalidState» при каждой следующей попытке доступа. В худшем случае, он полностью сломан и приведет к совершенно непредсказуемому поведению, потому что он предполагает, что вы не сделаете что-то настолько плохое. Такое поведение может привести к тому, что Windows выгонит ваш процесс из-за нарушений доступа к памяти.

Существует базовая классификация , которую я использую для исключений. Хотя это исключение в худшем случае является экзогенным исключением для вашего кода, его следует считать фатальным для анализатора и данного документа. Продолжая после этого, не собираюсь добавлять какую-либо ценность. В лучшем случае он добавляет больше бесполезных сообщений об ошибках, которые скрывают настоящую ошибку.

90% случаев, когда вы получаете ошибку компилятора, вы получаете сообщение, потому что синтаксис неправильный. И часто это так неправильно, синтаксический анализатор исходного кода не может больше понять, что он видит. Он не сможет сказать вам , где проблема даже .

Вы должны выставить / зарегистрировать каждое исключение, прекратить синтаксический анализ после первого и попросить пользователя разобраться с проблемой (чтоявно за пределами вашей работы).

0 голосов
/ 01 декабря 2019

Вы можете попытаться добавить дополнительный столбец Status в таблицу Excel, например, вы можете адаптировать свою логику и сохранить ее в таблице Excel, которая сохраняется в БД.

class Program
{
    static void Main(string[] args)
    {
        Customer Cust = new Customer();
        List<Customer> Customers = Cust.GetCustomers();

        foreach(Customer c in Customers)
        {
            Console.WriteLine(c.Name);
        }

        Console.Read();
    }
}

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }

    public string  Status { get; set; }
    List<Customer> Customers = new List<Customer>();

    public  List<Customer> GetCustomers()
    { 
        //Your Foreach Logic will be replaced
    for(int i=0;i<3;i++)
        {
            if (i % 2 == 0)
            {
                Customers.Add(new Customer { Id = i, Name = "Name" + i, Status = "Success Message" });
            }
            else
            {
                Customers.Add(new Customer { Id = i, Name = "Name" + i, Status = "Error Message" });

            }


        }

        return Customers;
    }
}
...