.NET Frameworkに定義されている、独自のコードで投げてはいけない例外があるか、それとも悪い習慣ですか?私は自分自身を書く必要がありますか?C#では、使用しないでください。組み込みの例外はありますか?
答えて
ユーザーエラーのために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
すでにあなたのための定義されたいくつかの例外があります。常にExceptionsを使用する前に自分自身をロールバックする
@downvoters:あなたのダウンボトムを説明してください、または無意味です – dfa
フレームワーク内のほとんどの例外クラスは、通常、フレームワーク固有のエラーを通知するために作られているため、再利用されません。 mentioned by @JaredParのように、フレームワークはフレームワーク内の特定の状態を示すためにフレームワークによって使用されます。
フレームワークには文字通り数十、おそらく数百の例外がありますので、私たちはをに使用するほうが便利です。ユーザーコード内の他のエラー条件については
- ArgumentException、ArgumentNullExceptionとArgumentOutOfRangeException
- InvalidOperationException
- NotSupportedException
- NotImplementedException
:私の頭の上には、これらは私が積極的に使うものであり、ベストプラクティスは、独自の例外クラスを作成することです。
同意します。そして、実際には、Frameworkメソッドが代わりに例外をスローする例外をスローするべきではありません。 ** Ie。**スーパバイザクラスにStack
マイクロソフトでは、ある時点で、Exceptionから直接継承しないようにプログラマに指示していましたが、代わりにApplicationExceptionをその基本クラスとして使用していました。しかし、その意見がまだ真実であるかどうかわからない...
正確なエラー条件( "NullReferenceException"や "InvalidArgumentException"など)をカバーする事前定義された例外がすでに存在する場合 - あなた自身のコードの中でそれらを再発明するのではなく、それらを投げる。
マルク・
ええ、ApplicationExceptionの姿勢が変更されました。そのクラスから派生しないことが推奨されています:http://blogs.msdn.com/brada/archive/2004/03/25/96251.aspx – JaredPar
.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
オンラインDesign Guidelines for Exceptions(具体的thisページを参照してください)原則アドバイスが含まれています。
書籍"Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition"には、このトピックに関する詳細および詳細な説明があります。
@Michael実際には、NullReferenceExceptionをスローすることをお勧めします。拡張メソッドの最初のパラメータ(thisパラメータ)がnullの場合。 null変数が期待どおりに動作するためには、これを行う必要があります。
- 1. assertRaisesは組み込みの例外で機能しますか
- 2. Cでチャネージケースの組み込み関数はありますか?
- 3. MVC組み込みシステムのGUIの例はありますか?
- 4. pythonスライスに組み込まれていない組み込み型以外はなぜですか?
- 5. 組み込みシステム(Cコード)で使用されるtdfファイルは何ですか?
- 6. dictが組み込みテストよりも速く組み込みをテストするのはなぜですか?
- 7. 組み込み用のC/C++組み込み関数VMOVD
- 8. 組み込みデータベースと組み込みデータベースの違いは何ですか?
- 9. 割り込みと例外コンテキストの違いは何ですか?
- 10. iOS Simulatorではなく、デバイス用のビルド時にのみフレームワークを組み込む方法はありますか?
- 11. SpringBootデータベース組み込みデータベースドライバ例外JAVA
- 12. ユーザー定義および組み込み例外の例外
- 13. Objective Cに組み込み関数がありますか?
- 14. Group_concatは組み込み関数ではありません - HeidiSQL
- 15. 最初にPuTTYを使用するのではなく、Oracle SQL Developerで組み込みのSSHを使用してください。
- 16. KAAはOSなしの組み込みボードに使用できますか?
- 17. Scala StdIn読み込みメソッド - 正しい使い方(かっこは省略しないでください)
- 18. 読み込み/書き込み - テキストファイルまたはPostGresより詳しくお読みください
- 19. Visual C++で128ビットの組み込み組み込み
- 20. MVC 4には組み込みのサイトマップソリューションがありますか?
- 21. Rustに組み込みのID関数はありますか?
- 22. Javaの組み込みデータベース/ファイルバックアップフレームワークはありますか?
- 23. セットリーダーから読み込む組み込み関数はありますか?
- 24. IE8のいくつかの組み込み関数がFunctionのインスタンスではないのはなぜですか?
- 25. golangにコマンドラインインタプリタ用の組み込みパッケージがありますか?
- 26. Cで組み込みのスワップ関数がないのにAssemblyにxchgがあるのはなぜですか?
- 27. 組み込み型ではなくC++からCythonを呼び出す
- 28. アプリケーションで組み込みスクリプトを使用するにはどのような要因がありますか?
- 29. 組み込みスキーマでEctoでMoneyを使用していますか?
- 30. SWIGの新しい組み込み機能でpythonappendを使う方法はありますか?
NullReferenceExceptionを除いて私は同意します...それが異なって振るわない限り、誰かがヌルにすることができないパラメータとしてnullを渡すときにこれを投げることは有効だと思います。 – Eddie
@Eddie NullReferenceExceptionではなくArgumentNullExceptionを使用する必要があります。そしてはい、それは行動を違ったものにします。それは異なるHRESULTコードを持つでしょう。 – JaredPar
"Exception"をリストに追加する必要があります。それをキャッチする唯一の方法は_all_例外を呑み込むことです。 – Michael