2009-04-25 10 views
6

私は、の私は、引数eを検証するために拡張メソッドC#の:拡張メソッドで "この" 引数を検証するためのベストプラクティス

public static T TakeRandom<T>(this IEnumerable<T> e) 
{ 
    ... 

を持っていると言うべきでみましょう:

A)の場合(E ==ヌル))(新しいとNullReferenceExceptionをスロー
B)の場合(E == nullの)新しい例外ArgumentNullException( "E")
Cを投げる)電子をチェックしませ

コンセンサスは何ですか?

私が最初に考えたのは、常に引数を検証することで、ArgumentNullExceptionがスローされました。それから、TakeRandom()はeのメソッドになるので、たぶんNullReferenceExceptionになるはずです。しかし、それがNullReferenceExceptionである場合、TakeRandom()内でeのメンバーを使用しようとすると、とにかくNullReferenceExceptionがスローされます。

おそらく、リフレクターを使ってピークに達し、フレームワークが何をしているのかを調べるべきでしょう。

+0

私は今日、この質問を私の頭の中に入れた。愛を持っていなければなりませんStackOverflow.com - それはすべての答え(および質問、時には複数回)があります。 :) – orj

答えて

9

ArgumentNullExceptionをスローする必要があります。引数の検証を試みているため、引数の検証に合わせて例外をスローする必要があります。 NullReferenceExceptionは引数の検証例外ではありません。ランタイムエラーです。

拡張メソッドは、フードの静的メソッドに過ぎず、そのまま呼び出すことができます。拡張メソッドでNullReferenceExceptionをスローするのは理にかなっているように見えるかもしれませんが、静的メソッドではそうではありません。このメソッドで呼び出し規約を判断することは不可能であり、したがってArgumentExceptionがより良い選択です。

また、明示的にNullReferenceExceptionをスローしないでください。これは、CLRによってのみスローされます。通常、CLRによってスローされる例外を明示的にスローすると、微妙な違いが生じます。

これはたぶん私はクレイジーだが、それは、引数であることから、私は例外ArgumentNullExceptionを投げるだろうにも、次の

4

Enumerable LINQ演算子との一貫性のために、(NullReferenceExceptionではなく)ArgumentNullExceptionをスローします。

私は、TakeRandomメソッドで検証を行います。なぜなら、スタックトレースは、null引数を指定するオブジェクトであるTakeRandomであることを明確にしているからです。

1

のデュープに近い:/

一般可能であれば、System.ApplicationExceptionから派生した例外をスローすることです。 NullReferenceExceptionは、フレームワーク/ CLRがスローするものです。

事前定義された共通言語 のSystemExceptionに由来 ランタイム例外クラス:例外の

http://msdn.microsoft.com/en-us/library/system.exception(VS.71).aspx

2つのカテゴリは、ベースクラス例外下 存在します。ユーザー定義の アプリケーション例外クラスは、ApplicationExceptionの から派生しました。

+0

"可能であればSystem.ApplicationExceptionから派生した例外をスローする" - それは.NET 1.0のMicrosoft独自のアドバイスですが、現在は変更されており、ApplicationExceptionは廃止予定です。その理由のためGoogle。 – Joe

+0

@Joe詳しく教えてください。非常にまれなケースで、私自身の例外を作成します....なぜ、私はApplicationExceptionから継承しませんか?ありがとう –

+0

@Deviant:私は記事を便利には持っていませんが、これはFramework Design Guidelinesで議論されていると思います。 ApplicationExceptionの背後にある元々の考えは、 "catch(ApplicationException ex)"ブロックを持ち、システム例外に対してアプリケーション例外とは異なる何かをするということでした。これは有用ではないことが判明し、アプリケーション例外ですべてのシステム例外をラップするためにアプリケーションコードが必要になります。フレームワーク設計ガイドラインには、独自の例外を作成するタイミングと例外を捕捉するタイミングについての優れたルールもあります。 –

関連する問題