2009-04-18 8 views

答えて

22

ユーザーエラーのためにCLRによって自動的にスローされる例外をスローしないでください。インスタンス

  • StackOverflowExceptionが
  • とNullReferenceException
  • AccessViolationException
  • 等...

ためのものであるが何をしている理由は、そう、あなたのAPIを呼び出す人々のための混乱を作成します。ユーザーは、APIによって積極的にスローされた例外と、積極的にスローされない例外(CLRによってスローされる)とを区別することができます。

なぜなら、積極的にスローされた例外は一般的にAPIの既知の状態を表すからです。私がAPIを呼び出し、それがArgumentExceptionを投げた場合、私は、与えられたオブジェクトが良い状態にあるという合理的な期待を持っています。それは潜在的に悪い状況を認識し、積極的にそれを説明しました。一方、NullRefrenceExceptionがスローされた場合、これはAPIが不明なエラーを検出し、現在は信頼できない状態にあることを示します。

また、これらの例外は、CLRではなくユーザーコードによってスローされたときの動作が異なります。たとえば、ユーザーコードによってスローされた場合はStackOverflowExceptionをキャッチできますが、CLRによってスローされた場合はスローされません。あなたが直接例外、ApplicationExceptionをまたはのSystemExceptionを投げるべきではないマイケルさんのコメント

への対応

EDIT。これらの例外タイプは、あなたのAPIを呼び出すコードに意味のある情報を提供するにはあまりにも一般的です。本当にあなたは非常に説明的なメッセージをメッセージパラメータに入れることができます。しかし、メッセージに基づいて例外をキャッチするのは簡単ではありません。タイプに基づいてキャッチするほうがはるかに優れています。このテーマに関する

FxCopのルール:http://msdn.microsoft.com/en-us/library/ms182338(VS.80).aspx

+0

NullReferenceExceptionを除いて私は同意します...それが異なって振るわない限り、誰かがヌルにすることができないパラメータとしてnullを渡すときにこれを投げることは有効だと思います。 – Eddie

+10

@Eddie NullReferenceExceptionではなくArgumentNullExceptionを使用する必要があります。そしてはい、それは行動を違ったものにします。それは異なるHRESULTコードを持つでしょう。 – JaredPar

+5

"Exception"をリストに追加する必要があります。それをキャッチする唯一の方法は_all_例外を呑み込むことです。 – Michael

0

すでにあなたのための定義されたいくつかの例外があります。常にExceptionsを使用する前に自分自身をロールバックする

+0

@downvoters:あなたのダウンボトムを説明してください、または無意味です – dfa

9

フレームワーク内のほとんどの例外クラスは、通常、フレームワーク固有のエラーを通知するために作られているため、再利用されません。 mentioned by @JaredParのように、フレームワークはフレームワーク内の特定の状態を示すためにフレームワークによって使用されます。

フレームワークには文字通り数十、おそらく数百の例外がありますので、私たちはに使用するほうが便利です。ユーザーコード内の他のエラー条件については

:私の頭の上には、これらは私が積極的に使うものであり、ベストプラクティスは、独自の例外クラスを作成することです。

+0

同意します。そして、実際には、Frameworkメソッドが代わりに例外をスローする例外をスローするべきではありません。 ** Ie。**スーパバイザクラスにStack をカプセル化し、 'stack.Pop()'を呼び出すメソッドを持つ場合は、 'System.Collections.Generic.Stack 'オブジェクトに 'InvalidOperationException'をスローします。 > 0個の要素をチェックした後に自分自身を投げないでください。 –

2

マイクロソフトでは、ある時点で、Exceptionから直接継承しないようにプログラマに指示していましたが、代わりにApplicationExceptionをその基本クラスとして使用していました。しかし、その意見がまだ真実であるかどうかわからない...

正確なエラー条件( "NullReferenceException"や "InvalidArgumentException"など)をカバーする事前定義された例外がすでに存在する場合 - あなた自身のコードの中でそれらを再発明するのではなく、それらを投げる。

マルク・

+2

ええ、ApplicationExceptionの姿勢が変更されました。そのクラスから派生しないことが推奨されています:http://blogs.msdn.com/brada/archive/2004/03/25/96251.aspx – JaredPar

+1

.NET 2.0と3.0の間では私は思っています。 .NET 2.0のApplicationExceptionから派生するアドバイスは、2.0以前のバージョンのMSDNにはまだ存在します。http://msdn.microsoft.com/en-us/library/system.applicationexception(VS.80).aspx 3.0の変更 - http://msdn.microsoft.com/en-us/library/system.applicationexception(VS.85).aspx – BlackWasp

3

@Michael実際には、NullReferenceExceptionをスローすることをお勧めします。拡張メソッドの最初のパラメータ(thisパラメータ)がnullの場合。 null変数が期待どおりに動作するためには、これを行う必要があります。

関連する問題