2013-09-23 5 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), मुझे बता रहा है कि मैंने एक खालीपारित किया हैया to मूल्य, निर्माता के लिए?

तो मैं अपना अपवाद क्यों फेंक दूंगा?

+8

आपका फ़ंक्शन एक ही पैरामीटर नामों के साथ मौजूदा कन्स्ट्रक्टर के चारों ओर एक छोटा सा रैपर प्रतीत होता है। ज्यादातर मामलों में, पास पैरामीटर और किसी भी आंतरिक फ़ंक्शन/विधि कॉल के बीच कुछ परिवर्तन होता है। आपका कॉलर पैरामीटर 'बार' के बारे में शिकायत करने वाले अपवाद को समझ नहीं सकता है जब उन्होंने केवल पैरामीटर' foo' पास किया था। –

+0

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

+0

मेरा मानना ​​है कि "मैं अपना अपवाद क्यों फेंक दूंगा?" एक सवाल है कि आपको खुद से पूछना चाहिए। अगर आपको कारण नहीं दिख रहा है, तो ऐसा क्यों करें? वैसे भी MailMessage कन्स्ट्रक्टर अपवादों को फेंक देगा जो आपको वही चीजें बताते हैं जो कस्टम अपवाद करते हैं, इसलिए इस मामले में उन्हें रखना जरूरी नहीं है, लेकिन यह अधिक परिष्कृत मामलों में एक अलग मामला है, जहां आप जानना चाहते हैं कि अधिक विस्तार से क्या हो रहा है । –

उत्तर

4

इसका कारण काफी सरल है - यह डीबग करना आसान बनाता है।

किसी भी विधि के लिए (और यह अधिक जटिल तरीकों का ट्रूअर है) जिसके लिए एक गैर-शून्य पैरामीटर की आवश्यकता होती है, SendMail से एक स्पष्ट अपवाद देखने के लिए किसी अपवाद परिदृश्य को डिबग करने के लिए यह बहुत आसान होगा, "अरे, 'से' शून्य है; मुझे इसकी आवश्यकता नहीं है, "SendMail (या उसके भीतर कुछ नेस्टेड विधि कॉल) के भीतर कुछ विधि कॉल करने की आवश्यकता है, एक NullReferenceException फेंक दें (जो आखिरकार, क्या होगा यदि कोई भी नहीं होगा प्रश्न में विधियां शून्य जांच करता है)।

फिर, आपके पास परिदृश्य है - लाइन के नीचे 6 महीने - आप तय करते हैं कि SendMail को कुछ और करने की आवश्यकता है; जैसे (एक मामूली उदाहरण के रूप में) डेटाबेस में किसी प्रकार का ऑडिट ध्वज सेट करें। अब, यदि आप विधि को खत्म करने देते हैं, तो आपके पास एक अवैध ध्वज है (या आप अपनी विधि के अंदर की चीजों के क्रम के आधार पर कर सकते हैं)। यह कहने के लिए बहुत बेहतर है कि "वास्तव में, यदि मेरे पैरामीटर अमान्य हैं, तो बस तुरंत विफल हो जाएं," विधि को आगे बढ़ने और संभावित साइड इफेक्ट्स करने के बजाय।

0

ईआरएम ... आप 100% में यकीन है कि var msg = new MailMessage(from, to, subject, body) { IsBodyHtml = true };

उन अपवादों फेंक देते हैं कर रहे हैं? दृष्टिकोण 2 अपरिभाषित व्यवहार है। यह इकाई का परीक्षण कैसे किया जाना चाहिए?

SendMail ("", "", "") क्या करता है? extacly? यह दूसरे दृष्टिकोण से स्पष्ट नहीं है।

आप एक टिप्पणी जोड़ सकते हैं। लेकिन क्यों? clean code

arroach 1 स्पष्ट रूप से परिभाषित करता है कि फ़ंक्शन विफल होने जा रहा है। और यह विफलताओं को संभालने के लिए कैसे जा रहा है। आपके कोड को स्पष्ट करना चाहिए कि क्या करता है, टिप्पणियां नहीं।

पीएस

नया ArgumentNullOrWhiteSpaceException("from") फेंक दें; आपके SendMail फ़ंक्शन में फेंक दिया गया है, जो समस्या के स्रोत के निकट है।

यदि आप दृष्टिकोण 2 का उपयोग करते हैं तो केवल भगवान जानता है कि आपके कॉल में कितना गहराई है, अगर यह बिल्कुल पकड़ा जाएगा।

भी आप somethinf तरह writting द्वारा इस सुधार सकता है:

ArgumentNullOrWhiteSpaceException("from - this is usually caused if poo is not bared by poo in goo"); 'जो कुछ महीने बाद आपके जीवन को सरल बना सकता है।

1

आम तौर पर, मुझे लगता है कि आपके स्वयं के अपवाद को फेंकना उचित है जब आप जिस फ़ंक्शन को कॉल कर रहे हैं उससे अधिक प्रासंगिक जानकारी दे सकते हैं (या तो अपने कोड में अधिक विशिष्ट अपवाद को संभालने के लिए या बेहतर त्रुटि संदेश वापस करने के लिए उपभोक्ता)।

इस मामले में ऐसा लगता है कि आप Send() कोई जानकारी नहीं जोड़ पाएंगे।

1

smtp.SendMail एक InvalidOperationException (सिस्टम नाम स्थान में)

इस में आप एक अधिक उपयुक्त अपवाद प्रकार फेंक रहे हैं, प्रकार प्रकार से यह आसान समझते हैं और अपवाद को पकड़ने के लिए फेंक देते हैं। अवैधऑपरेशन अपवाद एक बहुत ही सामान्य वर्ग है। अपना अपवाद फेंककर कोड अधिक पठनीय है और यदि आप बाद के बिंदु पर विधि बदलते हैं, तो एक ही अपवाद को संभाला जा सकता है, उदाहरण के लिए किसी अन्य मेलक्लिएंट का उपयोग करके।

संबंधित मुद्दे