2015-12-08 10 views
7

私は10年以上にわたって.NETの開発者でしたので、私は決してその答えを知らなかったという面白い質問があります。私はそれを得る - 引数がnullの場合、ArgumentNullExceptionをスローすることができます。ヌル値を逆参照しようとすると、NullReferenceExceptionがスローされます。予期しないnull値にはどのような例外を投げるべきですか?

しかし、私は次のようなコードがある場合:

var someVitalObject = someServiceReference.GetVitalObject(); 

if (someVitalObject == null) 
{ 
    throw new IDontKnowWhatException(); // what exception should I throw here? 
} 

を、これは必ずしも例外が先に投げされている必要がありますするサービスの問題ではありません。

+0

NullReferenceException? –

+0

これは実行フローのエラーではありませんか?あなたのアプリが終了する原因になりますか?多分、より多くの文脈は、私たちが問題をより良く理解するのに役立ちます。 –

+5

'GetVitalObject()'は契約を破っていますか、それともnullを返すのに有効ですか? –

答えて

0

私はSystem.NullReferenceExceptionを投げます。または、あなたがそれに不満を持っている場合は、独自の目的のために、より特殊化された型のヌル参照例外を使用してそれから派生することができます。

+2

いいえ、それは通常、ヌル参照の逆参照の結果です。基本的には、十分なチェックをしていない*ことを示しています。基本的には、私のログには誤解を招く例外があります。 –

+2

'NullReferenceException'を投げると、誤解を招きます。 –

+0

だから* do *あなたはnull ref例外をスローしますか? –

4

もっと文脈を見ることなく言うのは難しいですが、おそらくSystem.InvalidOperationException

オブジェクトの現在の状態に対してメソッド呼び出しが無効な場合にスローされる例外です。したがって、あなたはそれに情報の種類を保存するように制御することができるようになります

public sealed class MyException : Exception 
{ 
    ... 
} 

0

ApplicationExceptionからかExceptionから継承された独自のExceptionクラスを作成することを検討してください。

+0

一般に 'ApplicationException'を継承することは悪い習慣とみなされますhttp://stackoverflow.com/questions/52753/should-i-deive-custom-exceptions-from-exception-or-applicationexception-in-net – juharr

+0

@juharr無駄です==悪い練習ですか? [ApplicationExceptionは役に立たないと思う](http://blogs.msdn.com/b/kcwalina/archive/2006/06/23/644822.aspx):* ApplicationExceptionは有害ではないとみなされず、役に立たない。* – Dmitry

+0

私は思っていた悪い習慣として 'ApplicationException'をキャッチすること。 – juharr

1

メソッドパラメータを直接チェックするときにのみ、System.ArgumentNullExceptionを使用します。コールの結果を検証するときは使用しません。

私がスローする例外のタイプは、コンテキストによって大きく異なります。私は通常、関数に渡されたオブジェクトに対して例外ArgumentNullExceptionを使用

public class VitalObjectNotAcquiredException : Exception { ... } 
1

:しかし、この場合には私はおそらくのようなカスタム例外のために行くだろう。何か他のnull関連私は使用InvalidOperationException。特殊なケースでは、意味をなさない場合はカスタム例外を作成します。

0

個人的には、私はGetVitalObjectメソッド契約に従って選択します。このメソッドがnullでないオブジェクトを返す必要がある場合は、この場合は例外をスローするように変更します。

メソッドを制御できない場合や、null値を返すのが正しい場合(ただし、コンテキスト内ではない場合)は、MarkとDmitryが既に述べたようにカスタム例外を使用します。

関連する問題