Как передать исключения между слоями? - PullRequest
0 голосов
/ 16 мая 2018

У меня есть проект, разделенный на 3 слоя. На уровне бизнес-логики есть два класса, которые читают и записывают файл CSV. В операторе using мне нужно обработать IOException, и я обнаружил, что могу сделать это с помощью DTO и «отправить» в UI Layer описание проблемы, но я не знаю, как. Вы можете объяснить мне, пожалуйста? Или, может быть, это еще один хороший способ передачи информации между слоями.

Метод записи:

public void WriteCustomers(string filePath, IEnumerable<Customer> customers)
    {
        try
        {
            using (var streamWriter = new StreamWriter(filePath))
            {
                var csvWriter = new CsvWriter(streamWriter);
                csvWriter.Configuration.RegisterClassMap<CustomerMap>();
                csvWriter.WriteRecords(customers);
            }
        }
        catch (IOException)
        {

        }
    }

Подход решения:

public void WriteCustomers(string filePath, IEnumerable<Customer> customers)
        {
            if (!File.Exists(filePath))
                throw new IOException("The output file path is not valid.");
            using (var streamWriter = new StreamWriter(filePath))
            {
                var csvWriter = new CsvWriter(streamWriter);
                csvWriter.Configuration.RegisterClassMap<CustomerMap>();
                csvWriter.WriteRecords(customers);
            }
        }

1 Ответ

0 голосов
/ 16 мая 2018

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

namespace My.UiLayer
{
    public class MyUiClass
    {
        try
        {
            BusinessLogicClass blc = new BusinessLogicClass();
            blc.WriteCustomers(string filePath, IEnumerable<Customer> customers);
        }
        catch (IOException e)
        {
          // Read from 'e' and display description in your UI here
        }
    }
}

Обратите внимание, что вы можете изменить вышеприведенное, чтобы перехватывать все исключения с помощью Exception, а не просто IOException ввыше, в зависимости от того, что вы хотите отобразить пользователю

Если вам нужно конкретное сообщение из разных классов процедур, вы можете сделать что-то вроде следующего:

public void WriteCustomers(string filePath, IEnumerable<Customer> customers)
    {
        try
        {
           // Code
        }
        catch (IOException e)
        {
            throw new IOException("Error in write customers", ex);
        }
    }


public void WriteSomethingElse(string filePath, IEnumerable<Something> s)
    {
        try
        {
           // Code
        }
        catch (IOException e)
        {
            throw new IOException("Error in something else", ex);
        }
    }

И они будут перехвачены на уровне пользовательского интерфейса с указанным вами сообщением.Существует множество способов захвата / обработки ошибок, но ключевой момент заключается в том, что ошибка пройдет уровень вверх;вам не нужен объект передачи данных (DTO) для отправки этой информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...