1. ホーム
  2. c#

私のメソッドはそれ自身の例外を投げるべきですか、それともファイルが存在しない場合に.NETに投げさせるべきですか?

2023-09-22 17:44:12

質問

以下は私のコードです。

public void ReadSomeFile(string filePath)
{
    if (!File.Exists(filePath))
        throw new FileNotFoundException();

    var stream = new FileStream(filePath, ....)
    .....
}

自分で例外を投げるべきでしょうか( File.Exists のチェック)? FileStream はすでに FileNotFoundException をスローします。ここで、良いプログラミングの実践とは何でしょうか?コード分析では、パラメータを検証するべきだと言われています。しかし、私がそのパラメータを他のメソッド(私や他の人のコード)に直接渡しており、そのメソッド自体が例外を投げる場合、私のコードで引数を検証する利点は何でしょうか?

どのように解決するのですか?

if (File.Exists(f)) { DoSomething(f) } (またはその否定) はアンチパターンです。ファイルはこれら 2 つのステートメントの間に削除または作成することができるので、そのように存在を確認することはほとんど意味を持ちません。

それとは別に、コメントで指摘されているように、一方で File.Exists() は true を返すかもしれませんが、その後、さまざまな理由で実際のファイルのオープンに失敗する可能性があります。そのため、ファイルのオープンの際にエラーチェックとスローを繰り返す必要があります。

同じことを繰り返さず、コードを DRY に保ちたいのであれば、単にファイルを開こうとして new FileStream() をスローします。そして、例外をキャッチし、必要であれば、元の例外を再スローするか、アプリケーション固有の例外をスローします。

もちろん File.Exists() を呼び出すことは正当化できますが、このパターンではそうではありません。