コレクションであるプロパティ AssignedSoftware を持つ Asset オブジェクトがあります。
同じソフトウェアがアセットに複数回割り当てられていないことを確認したいと考えています。Add メソッドで、ソフトウェアが既に存在するかどうかを確認し、存在する場合は例外をスローします。
スローする必要がある標準の .NET 例外はありますか? または、ベスト プラクティスでは、独自のカスタム例外を作成する必要がありますか?
コレクションであるプロパティ AssignedSoftware を持つ Asset オブジェクトがあります。
同じソフトウェアがアセットに複数回割り当てられていないことを確認したいと考えています。Add メソッドで、ソフトウェアが既に存在するかどうかを確認し、存在する場合は例外をスローします。
スローする必要がある標準の .NET 例外はありますか? または、ベスト プラクティスでは、独自のカスタム例外を作成する必要がありますか?
なぜInvalidOperationException
答えとして受け入れられたのですか?! ? ArgumentException
!
InvalidOperationException
メソッド/プロパティが呼び出されたオブジェクトが、初期化されていない状態などのためにリクエストに対処できない場合に使用する必要があります。ここでの問題は、追加されるオブジェクトではなく、オブジェクトに渡されるオブジェクトです(それはだまされています)。考えてみてください。この Add 呼び出しがまったく行われなかったとしても、オブジェクトは通常どおり機能します。はい!
これはArgumentExceptionである必要があります。
同じキー値でアイテムをハッシュテーブルに2回追加しようとすると、.NetはSystem.ArgumentExceptionをスローするため、より具体的なものがあるようには見えません。より具体的なものが必要な場合は、独自の例外を作成することをお勧めします。
基本ライブラリ クラスが行うことなので、おそらく ArgumentException をスローする必要があります。
エラーに関するクラス ライブラリの設計ガイドライン ( http://msdn.microsoft.com/en-us/library/8ey5ey87(VS.71).aspx ) から:
ほとんどの場合、定義済みの例外タイプを使用します。クラス ライブラリのユーザーがこの新しい種類の例外をキャッチし、例外の種類自体に基づいてプログラムによるアクションを実行することが期待される、プログラムによるシナリオに対してのみ、新しい例外の種類を定義します。これは、パフォーマンスとメンテナンスに悪影響を与える例外文字列の解析に代わるものです。
...
無効なパラメーターが渡されるか検出された場合は、ArgumentException をスローするか、このクラスから派生した例外を作成します。
オブジェクトの現在の状態を考慮して、プロパティ セット アクセサーまたはメソッドの呼び出しが適切でない場合は、InvalidOperationException 例外をスローします。
これは「オブジェクトの状態が無効」なシナリオのように思えるので、ArgumentException よりも InvalidOperationException を選択します。パラメーターは有効ですが、オブジェクトのこの時点では有効ではありません。
一意のアイテムを含むコレクションが本当に必要な場合は、HashSet オブジェクト(C# 3.0 で使用可能) を調べてみてください。
それ以外の場合は、次の 2 つの方法があります。
どちらのアプローチも、一貫して使用している限り、ベスト プラクティスと見なすことができます。