2013-09-23 10 views
8

Aprroach 1:パラメータの検証、または失敗させますか?

public static void SendMail(string from, string to, string subject, string body) 
{ 
    if(String.IsNullOrWhiteSpace(from)) 
     throw new ArgumentNullOrWhiteSpaceException("from"); 

    if(String.IsNullOrWhiteSpace(to)) 
     throw new ArgumentNullOrWhiteSpaceException("to"); 

    var msg = new MailMessage(from, to, subject, body) { IsBodyHtml = true }; 

    using(var smtp = new SmtpClient()) 
     smtp.Send(msg); 
} 

アプローチ2:

public static void SendMail(string from, string to, string subject, string body) 
{ 
    var msg = new MailMessage(from, to, subject, body) { IsBodyHtml = true }; 

    using(var smtp = new SmtpClient()) 
     smtp.Send(msg); 
} 

なぜ私はアプローチ1のパラメータを検証するだろう、とちょうどスローするようにMailMessageを待ちません私が空になったことを伝える例外(アプローチ2)fromまたはtoの値をコンストラクタに渡しますか?

なぜ私は自分の例外をスローしますか?

+8

あなたの関数は、同じパラメータ名を持つ既存のコンストラクタを囲む単純なラッパーであるようです。ほとんどの場合、渡されたパラメータと内部の関数/メソッド呼び出しの間に何らかの変換があります。パラメータ 'foo'を渡したときにパラメータ' bar'に不平を言う例外を呼び出し元が理解できないかもしれません。 –

+0

http://stackoverflow.com/a/1102113/393487 –

+0

私は「なぜ私は自分の例外をスローするのだろうか?あなた自身に尋ねるべき質問です。あなたがその理由を見ないなら、それはなぜですか?とにかく、MailMessageのコンストラクタは、それらのカスタム例外と同じことを伝える例外をスローします。この場合、それらを持つ必要はありませんが、より洗練されたケースでは、別の問題です。 。 –

答えて

4

この理由は非常に簡単です。デバッグしやすくなります。

null以外のパラメータを必要とする任意のメソッド(これはより複雑なメソッドのほうがよい)では、例外シナリオをデバッグする誰かがSendMailからの例外を参照する方がはるかに簡単です。「ねえ、 'from'がnullです;私はそうである必要はありません。 "SendMail(またはその中のいくつかのネストされたメソッド呼び出し)の中で何らかのメソッド呼び出しをするよりも、NullReferenceExceptionをスローします(最終的には、問題のメソッドはヌルチェックを実行します)。

次に、6ヶ月間ダウンしたシナリオでは、SendMailは何か別の処理を行う必要があります。例えば(些細な例として)データベース内にある種の監査フラグを設定します。さて、もしあなたが単にメソッドを落とせば、あなたは無効なフラグを持っています(あるいは、あなたのメソッド内のものの順序によっては、あなたがするかもしれません)。私のパラメータが無効であれば、実際には、実際には、メソッドが実行され潜在的な副作用があるというよりはむしろただちに失敗します。

0

えーと...あなたはvar msg = new MailMessage(from, to, subject, body) { IsBodyHtml = true };

は、これらの例外をスローすることは100%でよろしいですか?アプローチ2は 未定義の動作です。どのようにこれをユニットテストするべきですか?

SendMail( ""、 ""、 "")は何ですか?エクサシィ?第2のアプローチからは明らかではない。

あなたはコメントを追加する必要があります。しかし、なぜ?そうでないとclean code

機能が失敗する場所を明確に定義します。どのように失敗を処理するのかについて説明します。あなたのコードはコメントではなく、何であるかを明確にすべきです。

P.S.

スロー新規ArgumentNullOrWhiteSpaceException("from");問題の原因に最も近いSendMail関数にスローされます。

アプローチ2を使用している場合、神だけがあなたの呼び出しレンタカーの深さを知っていれば、それはまったくキャッチされません。

もあなたのようsomethinfを足すことによって、これを改善することができます:

ArgumentNullOrWhiteSpaceException("from - this is usually caused if poo is not bared by poo in goo")。数ヶ月後にあなたの人生を単純化することができます。

1

一般に、自分の例外をスローすることは、呼び出している関数よりも関連性の高い情報を与えることができると正当化されると考えています(コード内で特定の例外を処理するか、ユーザー)。

この場合には、Send()ができなかったことは、任意の情報を追加しないだろうと思われます。

1

smtp.SendMailは、それが簡単に理解し、例外をキャッチするタイプの種類から(System名前空間)でInvalidOperationExceptionがこの中

あなたはより適切な例外タイプを投げているが、スローされます。 InvalidOperationExceptionは非常に一般的なクラスです。独自の例外をスローすることで、コードを読みやすくなり、別のメールクライアントを使用するなどして、後でメソッドを変更した場合でも同じ例外を処理できます。

関連する問題