私のメソッドはそれ自身の例外を投げるべきですか、それともファイルが存在しない場合に.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()
を呼び出すことは正当化できますが、このパターンではそうではありません。
関連
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み] 2つのリストを結合する
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み] 2つのリストを結合する
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】WebResource.axdとは何ですか?