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プロパティを新しいFileInfo()コンストラクターからスローされた実際の例外に設定してカスタム例外をスローする必要がありますか?

この具体的なシナリオの場合のベストプラクティスは何でしょうか...

4

1 に答える 1

14

一般に、次の 2 つの状況で例外を処理する必要があります。

  1. それを処理してエラーから回復する方法を知っています。外部からの介入がなく、呼び出し元のコードに対して透過的な方法で行う必要があります。
  2. 独自の例外で例外をラップしたい。これは、呼び出し元のコードに追加情報を伝える必要がある場合や、特定の例外が呼び出し元のコードにとってそれほど重要ではない場合に役立ちます (ただし、常にinnerException例外のコンストラクターにパラメーターとして含める必要があります)。

したがって、スローされる可能性のある例外のいずれかについて (MSDN の例外リストが網羅的であるとは考えないでください...残念ながら、その多くはボイラープレートです)、それから回復する方法がわからない場合黙って自分の例外にラップしたくない場合は、処理せずにバブルアップさせます。

于 2012-08-27T00:13:57.917 に答える