にNotImplementedException()
を投げるべきでしょうか?すべての可能な列挙型のケースがある場合は?switchステートメントのデフォルトでNotImplementedExceptionをスローする
答えて
数値がの場合、が定義されていなければならず、列挙値に相当する値を探していれば、何か他のものを受け取った、それは間違いなく無効な引数です。
しかし、あなたは文脈を考慮する必要があります。
このメソッドはプライベートで、クラスライブラリまたはアプリケーションのメンバーのみがアクセスできますか?そうであれば、最初に発生してはならないコーディングエラーです。断言し、失敗する。
一方、パブリックまたは保護されたメソッドであり、ライブラリを消費するクライアントがアクセスできる場合は、意味のあるメッセージ(よく知られている例外タイプが望ましい)を間違いなく投げてください。
フレームワークで列挙型が範囲チェックされていないことを覚えておくことは重要です。メソッドがEnvironment.SpecialFolder型のパラメータを必要とすることを指定することができます。 はすべての32ビット整数値を受け入れます。
したがって、要するに、あなたの方法が一般消費の場合、はい、是非、投げてください。一般消費用でない場合はAssertです。
+1よく言われました。予期しない値があなた自身のものである場合、Assertして失敗します。一方、あなたのコードを使用している他の誰かから来た場合は、例外をスローして、呼び出しコードに回復のチャンスを与える必要があります。 –
なぜアサートは投げるよりも優れていますか?おそらくその状態はまれなケースであり、開発者はそれをヒットせず、Assertがコンパイルされていないリリースビルドを使用しているテスターだけがヒットし、エラーは飲み込まれます。エラーを呑み込むのが良いですか?スタックトレースでクラッシュするのではなく、クラッシュしないで間違ったものをデバッグするのは難しいですか? –
もう1つの質問は、他社のAPIを書いていないと、エラーチェックをコードに入れる価値はどれくらいあるのでしょうか?短いコードは、エラーチェックのために各メソッドのサイズが倍増するコードよりも読みやすいと思います。ではない ? –
これは実際には特定のプロセスに依存しますが、はい、何かが存在しないと思われる場合はデフォルトで応答するのが良いプロセスです。
これは合理的な選択肢のようです。
個人的には、新しいタイプの例外(おそらくInvalidEnumException
)を作成し、サポートチームに意味をなさせる別の名前を付けて、それをスローします。
私は個人的に、無数の既存の例外タイプの1つを再利用しようと思います。 http://blogs.msdn.com/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx – Joe
私はこれが事実だとは思わないので、合意した、下落したカスタム例外タイプ。 –
コードがデフォルトに達していて、期待していなかった場合、これはコード内の何かがあなたの思考のように振る舞わないことを意味するので、私はApplicationException
を投げます。
ApplicationExceptionを使用するのに悩まされていませんか? –
私は聞いたことがない –
少なくとも、あなたはDebug.Fail()
を置くべきでしょう。
メソッドを実行できない場合に備えて、例外をスローする必要があります。しかし、列挙型の値を文字列表現に変換する場合は、代わりに警告文字列を返すことができます。明白な間違いで製品がクラッシュすることはなく、回避策があり、誰もが幸せになるでしょう。
NotImplementedExceptionではなく、ArgumentExceptionである可能性があります。それは本当にあなたがそれを使っている場所に依存します。
実際の使用状況によって異なります。統合の初期段階で例外をスローすると役立ちます。あなたのライブラリーのユーザーはすぐにエラーを知ることができます
何が起こるのでしょうか?どの文脈でswitch文が実行されていますか?そのような状況が起こるべきか?実行時に実動コードで実行する必要がありますか?あなたの単体テストはこの状況をカバーしていますか?もしそうなら、おそらくアサーションが良いでしょう。
まず、既知のケース以外の値が得られた場合、つまりスイッチオーバーされる変数は何を表していますか?次に、実際に起こっていることに合った例外タイプを使用するだけです。
本当に依存しています。
NotImplementedExceptionは、私のためにtodoマークのようなものです。誰かが後でコードを完成させることを意味します。しかし、私はそれが起こらないはずのデフォルトケースのケースだとは思わない。
オブジェクトの状態を確認するときは、InvalidOperationExceptionと考えるとよいでしょう。あなたの方法は、既存のケースでのみ機能するように設計されています。
入力パラメータを区別する場合は、常にArgumentExceptionが適切です。
他の場合、私はNotSupportedExceptionを好む。これは、プラットフォームやバージョンに問題があることをわずかに示しています。そして、コードの互換性のないバージョンは、発生してはならないスイッチのデフォルトのケースが起こったときの問題の真のルートです。
面白い答えです。あなたのモチベーション/推論は何ですか? –
@Tim:私は自分の答えを更新しました。 –
優れた答え、更新していただきありがとうございます。私はあなたがそれをどのように置いたかをあなたに完全に同意します。それは私の頭の中でそれをまっすぐに得るのを助けました。 –
私はあなたのアプリに依存していると思いますし、範囲外の値で終わった場合どうなるでしょう。 – Joe