2012-03-11 13 views
4

到達不能な場所に投げる正しい例外は何ですか?例えば

switch (number) 
{ 
    case 1: return DoOne(); 
    case 2: return DoTwo(); 
    case 3: return DoThree(); 
    case 4: return DoFour(); 

    default: 
     throw new ???Exception("Unexpected number encountered."); 
} 

この質問のために、と仮定してください:

  • numberは、それはnumberがすべきことを不変クラスであるクラスで

  • 民間分野であります常に1と4の間にある。他のすべては、このクラスのバグを示します。つまり、例外がトリガされた場合、それはではない呼び出し元の障害ですが、常にクラスの作成者です。

この場合、スローする正しい例外は何ですか?

答えて

3

編集

このような状況に合っは良いデフォルトのCLR例外はありません。あなたはあなた自身を転がすべきです。私は例外から直接派生したいと思います。おそらく、このエラーを他のタイプのエラーと混同したくないからです。

この一見回復不可能な状況からプログラムを復旧できる状況があります。このクラスの問題が他の場所に広がらないことが確実な場合は、たとえば、このクラスを副作用のない関数の一部として使用する場合です。これは、実例と思われるかもしれませんが、意図的にコードを書いたり、パッケージ化して副作用がないようにしているわけではありません。

私はあなたがプログラムを終了するような劇的な何かをするべきではないと思います。あなたの責任ではないクラスの著者として。

このクラスを使用したソフトウェアの著者として、私は何か悪いことをユーザーに伝え、バックアップを保存し、情報を記録し、データベースに書き込むことを試みる.... 。

+0

例外処理自体は[フレームワーク設計ガイドライン](http://www.amazon.co.uk/Framework-Design-Guidelines-Conventions-Libraries/dp/0321246756)にはありません。さもなければ、この答えは非常に意味があります。 – Timwi

+0

@ティムウィー:振り返ってみると、私は同意します。彼らはなぜあなたがExceptionを抽象クラスにしなかったのか疑問に思います。私は編集します。 –

2

エラーはエラー状態のためですので、InvalidOperationExceptionを使用してください。 numberが呼び出されたメソッドの引数であった場合、私はを投げていたでしょう。

+0

ええええええええええええええええええええええええええええ、「無効な操作」を起こした人には、責任があります。 –

+0

@jdv:文書は、私にとって十分に近い一致を示しています...私は言葉をどのように解釈するかによって異なります。 –

+0

"for the current state"の部分が気に入らない - この例外は、閉じたストリームで操作を呼び出すような、間違ったことを示しています。しかし、実際にあなたは間違ったことはしませんでした。クラス自体はバグです。 –

0

私はInvalidOperationも入れて、何が間違っているのか説明します。

私は、外部クラスによって使用されるはずのないすべての種類の内部列挙型を持っていますが、読み込むことができます。 プロパティセットでは、InvalidOperation例外が返されますが、それは意味があり、簡単に見つけることができます。

関連する問題