如何在层之间传递异常?

时间:2018-05-16 18:18:20

标签: c# exception design-patterns dto using-statement

我有一个分为3层的项目。在业务逻辑层中,有两个类读取和写入CSV文件。在using声明中,我需要处理IOException,我发现我可以使用DTO和"发送"到UI层问题描述,但我不知道如何。你可以解释一下吗?或者也许是在层之间传递信息的另一种好方法。

写方法:

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 :(得分:0)

错误的描述自然会冒泡到您调用它的UI层,因此您可以通过在那里显示消息来捕获和处理错误。下面是一个伪代码示例,可能有助于解释我的意思:

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);
        }
    }

这些将通过您指定的消息在调用UI层中捕获。您可能有多种方法可以捕获/处理错误,但关键是错误将传递给层;您不需要数据传输对象(DTO)来发送该信息。