重複したオブジェクトをコレクションに挿入しようとしたときにスローする正しい .NET 例外は何ですか?
-
09-06-2019 - |
質問
コレクションである AssignedSoftware プロパティを持つ Asset オブジェクトがあります。
同じソフトウェアが 1 つの資産に複数回割り当てられないようにしたいと考えています。Add メソッドで、ソフトウェアがすでに存在するかどうかを確認し、存在する場合は例外をスローします。
スローすべき標準の .NET 例外はありますか?それとも、ベスト プラクティスでは、独自のカスタム例外を作成する必要がありますか?
解決
クラス ライブラリのエラー設計ガイドラインより (http://msdn.microsoft.com/en-us/library/8ey5ey87(VS.71).aspx):
ほとんどの場合、事前定義された例外タイプを使用します。新しい例外の型を定義するのは、クラス ライブラリのユーザーがこの新しい型の例外をキャッチし、例外の型自体に基づいてプログラムによるアクションを実行することが期待されるプログラム シナリオの場合のみです。これは、パフォーマンスとメンテナンスに悪影響を与える例外文字列の解析の代わりに行われます。
...
無効なパラメーターが渡されたか検出された場合は、ArgumentException をスローするか、このクラスから派生した例外を作成します。
オブジェクトの現在の状態を考慮すると、プロパティ セット アクセサーまたはメソッドの呼び出しが適切でない場合は、InvalidOperationException 例外をスローします。
これは「オブジェクトの状態が無効」のシナリオのように見えるので、ArgumentException ではなく InvalidOperationException を選択します。パラメータは有効ですが、オブジェクトの存続期間のこの時点では有効ではありません。
他のヒント
なぜ InvalidOperationException
答えとして受け入れられましたか?それは、 ArgumentException
?!
InvalidOperationException
メソッド/プロパティが呼び出されたオブジェクトが、初期化されていない状態などの理由でリクエストに対応できない場合に使用する必要があります。ここでの問題は 追加されるオブジェクトではなく、オブジェクトに渡されるオブジェクトです (これは複製です)。 考えてみてください。この Add 呼び出しが一度も行われなかったとしても、オブジェクトは通常どおり機能するでしょうか。そうです。
これは、 引数例外.
同じキー値で項目をハッシュテーブルに 2 回追加しようとすると、.Net は System.ArgumentException をスローするため、これ以上具体的なものはないようです。より具体的なものが必要な場合は、独自の例外を作成することもできます。
基本ライブラリ クラスが行うことなので、おそらく ArgumentException をスローする必要があります。
そうですね、本当にユニークなアイテムのコレクションが必要な場合は、 HashSet オブジェクト (C# 3.0 で利用可能)。
それ以外の場合は、次の 2 つのアプローチが可能です。
- 先ほど述べたように、操作のカスタム例外を作成します。
- ブール値の結果を返す Add() メソッドを実装します。項目が追加された場合は true、コレクション内に項目がすでに重複している場合は false
一貫して使用している限り、どちらのアプローチもベスト プラクティスとみなされます。
私は常に InvalidOperationException が好きでした。ただし、DuplicateSoftwareAssignmentException などのカスタム例外を作成することもできます。
フレームワーク設計ガイドラインから:
「ArgumentExceptionをスローするか、このクラスから派生した例外を作成します。
Objectの現在の状態を考慮して、プロパティセットのアクセサまたはメソッドへの呼び出しが適切でない場合は、InvalidoperationException例外をスローします。」
現在の状態には、他のクラス インスタンスへの参照が含まれています。この場合、状態には追加されるインスタンスへの参照がすでに含まれているため、メソッドの呼び出しは不適切です。