.NET Frameworkには多くの事前定義された例外があります。たとえば、無効なパラメータが私のメソッドに渡された場合、ArgumentException
(または、パラメータがnull
だった場合)を発生させるはずです。現在のオブジェクト状態に対して無効なメソッドが呼び出された場合、私はInvalidOperationException
を呼び出すことになっています。あらかじめ定義されたThisIsABugExceptionはありますか?
"このコードは決してに届くはずがありません"の場合、あらかじめ定義された例外はありますか?私は正当化される、そのような稀な場合のために私自身の例外を作成するとは思わない
void myMethod() {
int a;
... /* Some complex code that manipulates a. In the end, "a" can only be 1 or 2. */
switch (a) {
case 1: ...
case 2: ...
default: // just an extra sanity check
// Oops, we should never be here.
// There's apparently some bug in the code above.
throw new ThereIsABugInTheCodeException();
}
}
:ここでは例です。一方、投げているのはException
is discouraged as wellです。私はAssertionFailedException
のいくつかの種類が適切だろうと思うが、私は.netフレームワークで何も見つかりませんでした。 (つまり、どちらのオプションではありませんのでTrace.Assertは、例外をスローしないことに注意してください。)
EDITを:明確にする:a
は引数ではありません。メソッドの途中で、私は正気チェックを行います(メソッドの最初のコードが正しい場合は、必ずしも必要ではありません)。私は健全性チェックが失敗し、例外をスローしたいと思います。どちらを投げますか? ArgumentException
should only be thrown if the caller of the method did something wrongのため、ArgumentException
は正解とは思われません。それはここでは当てはまりません。 メソッド自体は、実行時にバグを含んでいることを認識します。
私は['ArgumentOutOfRangeException'](http://msdn.microsoft.com/en-us/library/system.argumentoutofrangeexception.aspx)が必要だと思います。 –
しかし、 'a'は私のメソッドの引数ではありません。これはローカル変数です!私はそれを強調するために私の質問の例を更新しました。 – Heinzi
@Heinzi - これは 'switch'引数に引き渡された値です。 – Oded