1

構成 (私の場合はプロパティ) が null の場合を考えてみましょう。

public Configuration {get;set;}

if (configuration == null)
{
   throw NullReferenceException("Blah blah blah..");
}

しかし、どこかで「コードでnull参照例外をスローしないでください。NullReferenceExceptionこれはランタイム例外であり、ランタイムによってのみ発生する必要があります」と読みました。

もしそれが関数の引数だったら、私はArgumentNullException.

では、この場合の例外は何でしょうか? また、一般的に言えば、どのような状況でどの例外をスローする必要がありますか? これをグーグルで検索しましたが、満足のいく答えはありませんでした。

4

5 に答える 5

6

InvalidOperationExceptions states -オブジェクトの現在の状態に対してメソッド呼び出しが無効な場合にスローされる例外。null 参照は投げるべきではないことに同意します。

一般的な例外の別のリストを次に示します。

于 2013-04-17T07:11:15.063 に答える
4

null 参照の例外は、実際に何が問題なのかについて何も言わないため、アドバイスは正しいです。

値を null にすることが許可されていない場合は、何が問題なのかを説明する例外を見つけようとする必要があります。問題は参照が null であることではなく、参照が null である根本的な理由です。

十分に近い例外クラスが見つからない場合は、たとえば独自のConfigurationMissingException例外を作成できます。

于 2013-04-17T07:10:54.677 に答える
4

InvalidOperationException

メソッド呼び出しがオブジェクトの現在の状態に対して無効である場合にスローされる例外。

あなたの状況のように聞こえます。

基本的に、引数に関連するものではなく、組み込みの例外をスローしたい場合、通常は 2 つの例外のいずれかを選択します。要求を受け入れることができない場合NotImplementedExceptionは、適切です。しかし、それが構成または状態の問題であればInvalidOperationException、法案に適合します。

于 2013-04-17T07:11:09.860 に答える
3

どのような場合でも、例外をスローしないでください。null構成に値を設定しようとするなど、予期しないことが起こった場合にのみ使用します。ただし、構成が可能でnullあり、既に構成されている場合は、別の方法で処理する必要があります。

于 2013-04-17T07:26:30.210 に答える
2

ここには実際には3つのケースがあると思います:

まず、クラスのユーザーが間違ったことをした結果、これが発生する可能性はありますか? 最初に何かを呼び出したり設定したりするのを忘れていませんか (つまり、違反した一時的な依存関係がありますか)。

もしそうなら、適切な例外は、問題を修正する方法を説明するInvalidOperationExceptionMessageまたはおそらく以下に説明するようにコード契約を指定することのいずれかであると思います。

第二に、これはクラスの論理バグが原因でのみ発生するのでしょうか? 言い換えれば、クラスのユーザーがそのパブリック メソッドとプロパティをどのように使用しても、これが発生することはあり得ないのでしょうか?

その場合、コード コントラクトを使用している場合は、次のように宣言して、これを宣言できます。

Contract.Assume(configuration != null);

私はこれがはるかに優れていると思います。ただし、違反によってスローされた例外は、キャッチした場合以外はキャッチできませんException。これは意図的なものであり、正しい選択です。

コード コントラクトを使用していない場合は、 をスローすることになりますInvalidOperationException

第三に、この例外がプログラムの制御外の外的要因によって自然に発生する場合、問題に一致する既存の例外タイプがない場合は、おそらくカスタム例外タイプを作成する必要があります。ただし、この特定の例では、そうである可能性は低いと思われます。他の場所で処理されることを期待します。

于 2013-04-17T07:58:07.560 に答える