3

我是 C# 开发人员,我想使用工厂模式来创建代表硬盘上的文件或目录的对象。FileInfo 和 DirectoryInfo 是 .NET 中用于此目的的类,但我希望拥有自己的 IFileInfo 和 IDirectoryInfo 接口来包装它们,而不是它们。使用自定义接口而不是内置类的原因是因为我想添加一些额外的属性,例如文件外壳图标等......

所以我想使用工厂模式为文件/目录路径的给定字符串创建 IFileInfo 和 IDirectoryInfo 的实例。

所以工厂类看起来像:

public class MyFileInfoFactory
{
    IFileInfo Create(string filePath)
    {
        System.IO.FileInfo file = new System.IO.FileInfo(filePath);

        // turn FileInfo to my IFileInfo etc...
    }
}

现在查看 System.IO.FileInfo 文档(FileInfo MSDN)我看到有几个可能的异常可以抛出。我的问题是我应该在工厂 Create() 方法中处理所有这些异常吗?还是应该让它们向上传播到调用 MyFileInfoFactory.Create() 的任何代码?

如果第一个解决方案是可行的,那么下一步是什么?例如,我应该返回 null 还是可能抛出一些自定义异常,并将 InnerException 属性设置为从 new FileInfo() 构造函数抛出的实际异常?

只是想知道在这个具体场景案例中的最佳实践是什么......

4

1 回答 1

14

通常,您应该在两种情况下处理异常:

  1. 您知道如何处理它并从错误中恢复。在没有任何外部干预的情况下,您希望以对调用代码透明的方式这样做。
  2. 您想将异常包装在您自己的异常中。如果您需要向调用代码传达附加信息,或者特定异常对调用代码可能不是非常重要(尽管您应该始终将其作为innerException参数包含在异常的构造函数中),这将非常有用。

因此,对于任何可能抛出的异常(并且不要认为 MSDN 中的异常列表是详尽无遗的......不幸的是,很多这些东西都是样板文件),如果你不知道如何从中恢复默默地并且不想将其包装在您自己的异常中,然后不要处理它并让它冒泡。

于 2012-08-27T00:13:57.917 回答