2011-08-08 9 views
2

私は階層的にリンクされたオブジェクトのセットを格納するために使用できるフレームワークライブラリを設計しています。その後、葉を階層的に私が実行いくつかのカスタムルールに基づいて、親にリンクされていない場合は、ユーザーがのparamsを渡すStoreLeaf()を呼び出すとすると例外デザインInvalidParentExceptionとObjectAlreadyPresentException

class StoreSession { 
    StoreLeaf(leaf, parent) 
} 

:私は、次の方法によってスローすることができますどのような例外を決定する必要があり私はすでに保存しようとしていたオブジェクトがリポジトリ内のエントリを持っている場合、私は私が

、私はまた、( ObjectAlreadyPresentExceptionのようなもの)が例外をスローする必要があり、

例外をスローする(InvalidParentExceptionのようなもの)が必要ですFDGhereでも、これらの2つのシナリオを説明する例外はありません。

これらのエラー状態を記述する.NET例外はありますか?または、新しいExceptionタイプを作成する必要がある場合でも、そこから派生できる特定の.NET例外がありますか?

答えて

1

いいえ、これらの条件を表す特定の.NET Exceptionはありません。もしあれば、おそらくあなたのニーズに合ったデータ構造に固有のものであり、あなた自身のものを書くのではなく、そのデータ構造を使うでしょう。フレームワークは、最初に出てきたとき、最初の勧告は、ApplicationExceptionから派生した、と述べ

は、しかし、それはすぐに肥大化のかなりのビットにそのリードを明らかにし、効果がなかったので、現在の慣行は、 derive custom exceptions directly from Exceptionにあるました。

しかし、あなたの特定のケースでは、あなたがこれらの例外を受け入れることを計画しているアクション項目がない限り、おそらくInvalidOperationExceptionを使用するべきです。

の場合、これらの例外に対してアクションを実行する場合は、例外をまったく使用する必要があるかどうかを検討することができます。ビジネスロジックを例外から外すことは、一般に悪い習慣です。可能であれば、リターンコード/値を使用する必要があります。

1

これは捕捉されるべき例外のようには聞こえません。これはクライアントコードのバグを表しているため、キャッチハンドラはコードを書き換えることができません。そのため、専用の例外タイプを作成することはほとんどありません。には、例外が捕捉されて処理されることを意図している場合には、があります。

InvalidOperationExceptionいいえ、例外メッセージが正常です。

0

この種のガイドラインがないため、私はBCLで​​できるだけ類似した方法を見つける傾向があります。たとえば、IDictionaryの実装はsupposed to throw an ArgumentException for a duplicate key passed to the Add(TKey, TValue) methodであり、これはDictionaryが実際に行うものです。この場合、BCLの作者がArgumentExceptionをスローするという決定を後悔している証拠がない場合(私はAnnotage FDGのコメントなど)、既存のBCLメカニズムとの一貫性のためにアプローチを再利用する傾向があります。