6

そのため、Enterprise Library 4.1 例外処理アプリケーション ブロックを使用して、複数プロジェクト アプリケーションでの例外のログ記録/処理を処理しています。いくつかのカスタム例外があり、クラスが .NET フレームワークの標準クラス ライブラリで定義されているいくつかの例外をスローしています (ArgumentException、InvalidOperationException、ArgumentNullException など)。

今日、私たちのチーム リーダーは、.NET フレームワークがこれらの種類の例外をスローするため、後者を使用しないことを決定しました。アプリケーション ブロックのポリシーでのフィルタリングを容易にするために、カスタム例外のみを使用する必要があります。カスタムArgumentException、カスタムInvalidOperationException などのように、.NET 標準クラス ライブラリの例外をカスタム バージョンで実質的に複製する限り。

私の質問は、このアプローチの何が問題なのですか? その時は指が入らなかったのですが、異臭がして不安な気持ちが拭えませんでした。本当に大したことではない何かについて心配していますか? 尻尾が犬を少し振っているような気がします...

4

5 に答える 5

12

いや。私がそれについて好きではないのは:

  • 既存のタイプを複製します
  • 驚き最小の原則に違反します
  • つまり、間違った引数値を使用したすべての場所を検索する場合(たとえば)、単に検索するのではなく、例外の2つのタイプ階層を検索する必要がありますArgumentException

チームをリードして、Effective Java2ndeditionのアイテム60を読むことをお勧めします。はい、それはC#ではなくJavaに関するものですが、原則は同じです。

于 2009-03-12T22:06:25.633 に答える
4

Jon Skeet と Kev の回答を繰り返します。例外ポリシーで、独自の例外とは異なるフレームワーク レベルの例外を扱いたい場合は、例外のスタック トレースの使用を検討してください。

// Somewhere within a custom exception handler policy
var frame = new StackTrace(exception).GetFrame(0);
if (frame.GetMethod().DeclaringType.Namespace.StartsWith("MyNamespace.")) 
{
    // Handle exceptions from our code
}
else 
{
    // Handle framework-level exceptions
}
于 2009-03-12T22:21:11.900 に答える
4

Krzysztof Cwalinaと Brad Abrams によるFramework Design Guidelines book (初版) では、System可能な場合は名前空間で定義された既存の例外をスローすることを推奨しています。適合しない場合は、カスタム例外をスローします。

一致するカスタムのパラレル ユニバースを作成することは、努力の重複であり、私には何の価値もありません。結局のところ、コードがフレームワーク クラスではなくクラスをスローする場合、最終的に誰が責任を負ったかをスタック トレースから判断できます。 .ArgumentNullExceptionSystem.ArgumentNullExceptionSystem.ArgumentNullException

これは、コードの保守時間に関しては、現在および将来の不要な余分な作業の匂いがします。

于 2009-03-12T22:14:13.617 に答える
1

コードによってスローされた例外と.net基本クラスによってスローされた例外は、どちらも同じ方法で処理する必要があります。

どちらもおそらくコードの問題の兆候であるため、どちらも無視したり、フィルタリングしたりしないでください

于 2009-03-12T22:01:16.393 に答える
0

例外が公開しようとしている問題のタイプを正しく説明している場合は、.Net 例外をスローしても問題ありません (たとえば、引数が null の場合、ArgumentNullException をスローする必要があります)。.Net フレームワークで処理されない状況を見つけた場合 (たとえば、6 を 3 で除算したいが、アプリケーションで許可されていない場合)、カスタム例外を作成する必要があります。

于 2009-03-12T22:16:43.957 に答える