MSDN guidelines for standard exceptions कहता है:
संपत्ति setters के अंतर्निहित मूल्य पैरामीटर का नाम के लिए उपयोग मूल्य करो।
निम्न उदाहरण कोड एक संपत्ति है कि एक अपवाद है, तो फोन करने वाले एक अशक्त तर्क गुजरता फेंकता है पता चलता है।
public IPAddress Address
{
get
{
return address;
}
set
{
if(value == null)
{
throw new ArgumentNullException("value");
}
address = value;
}
}
साथ ही, MSDN guidelines for property design कहते हैं:
बचें फेंकने संपत्ति ही टिककर खेल से अपवाद नहीं।
संपत्ति प्राप्तकर्ता बिना किसी पूर्व शर्त के संचालन सरल होना चाहिए। यदि कोई गेटटर अपवाद फेंक सकता है, संपत्ति को फिर से डिजाइन करने पर विचार करें एक विधि बनें। यह सिफारिश सूचकांक पर लागू नहीं होती है। इंडेक्स अमान्य तर्कों के कारण अपवाद फेंक सकते हैं।
यह संपत्ति सेटर से अपवाद फेंकने के लिए मान्य और स्वीकार्य है।
तो null
पर सेटर में ArgumentNullException
फेंक, और ArgumentException
रिक्त स्ट्रिंग पर, और गेटर में कुछ भी नहीं है। चूंकि सेटर फेंकता है और केवल आपके पास बैकिंग फ़ील्ड तक पहुंच है, इसलिए यह सुनिश्चित करना आसान है कि इसमें अमान्य मान नहीं होगा। गेटर फेंकने के बाद व्यर्थ है। हालांकि यह Debug.Assert
का उपयोग करने के लिए एक अच्छी जगह हो सकती है।
बस लौट जो कुछ संपत्ति और दस्तावेज़ उपयोग अनुबंध के हिस्से के रूप में इस व्यवहार में है:
तुम सच में एक उचित डिफ़ॉल्ट प्रदान नहीं कर सकते, तो मैं तुम्हें तीन विकल्प हैं लगता है। कॉलर को इसके साथ सौदा करने दें। आप कन्स्ट्रक्टर में वैध मान भी मांग सकते हैं। हालांकि यह आपके आवेदन के लिए पूरी तरह से अनुचित हो सकता है।
गुणों के अनुसार संपत्ति को बदलें: एक अस्थायी मान पारित करने पर एक सेटर विधि, और InvalidOperationException
फेंकने वाली गेटर विधि जब संपत्ति को वैध मान कभी नहीं दिया गया था।
गेटटर से InvalidOperationException
फेंक दें, क्योंकि आप विचार कर सकते हैं कि 'संपत्ति कभी असाइन नहीं की गई है'। जबकि आपको आमतौर पर गेटर्स से फेंकना नहीं चाहिए, मुझे लगता है कि यह अपवाद बनाने का एक अच्छा कारण हो सकता है।
आप विकल्प 2 या 3 चुनते हैं, तो आप भी एक TryGet- विधि है कि एक bool
जो अगर संपत्ति एक वैध मान पर सेट कर दिया गया है इंगित करता है देता है को शामिल करना चाहिए, और इसलिए एक out
पैरामीटर में है कि मान देता है, तो । अन्यथा आप InvalidOperationException
को संभालने के लिए कॉलर्स को तैयार करने के लिए मजबूर करते हैं, जब तक कि वे पहले संपत्ति को स्वयं सेट नहीं कर लेते हैं और इस प्रकार जानते हैं कि यह फेंक नहीं देगा। int.Parse
बनाम int.TryParse
की तुलना करें।
मैं TryGet विधि के साथ विकल्प 2 का उपयोग करने का सुझाव दूंगा। यह किसी भी दिशानिर्देश का उल्लंघन नहीं करता है और कॉलिंग कोड पर न्यूनतम आवश्यकताओं को लागू करता है।
अन्य सुझावों
ApplicationException
बारे में जिस तरह से बहुत सामान्य है। ArgumentException
null
के लिए थोड़ा सा सामान्य है, लेकिन अन्यथा ठीक है।MSDN docs again:
सर्वाधिक विशिष्ट (सबसे व्युत्पन्न) अपवाद है कि है उचित फेंक है। उदाहरण के लिए यदि एक विधि एक अशक्त तर्क (दृश्य बेसिक में कुछ भी) प्राप्त करता है, यह बजाय System.ArgumentNullException इसके आधार प्रकार System.ArgumentException की फेंक चाहिए।
वास्तव में आप सभी (docs) पर ApplicationException
उपयोग नहीं करना चाहिए: टी से System.Exception वर्ग बल्कि:
टी से कस्टम अपवाद प्राप्त करें System.ApplicationException वर्ग।
यह मूल रूप से सोचा था कि कस्टम अपवाद ApplicationException वर्ग से निकाले जाते हैं चाहिए था, हालांकि, यह महत्वपूर्ण मूल्य जोड़ने के लिए नहीं मिला है। अधिक जानकारी के लिए, अपवादों को संभालने के लिए सर्वोत्तम अभ्यास देखें।
InvalidOperationException
के लिए जब एक विधि या संपत्ति को तर्क अमान्य हैं नहीं करना है, लेकिन जब एक पूरे के रूप आपरेशन अमान्य है (docs) के लिए। यह सेटर से फेंका नहीं जाना चाहिए:
यदि कोई अनुचित स्थिति एक System.InvalidOperationException अपवाद फेंक मत करो। सिस्टम। इन्वालिडऑपरेशन अपवाद को फेंक दिया जाना चाहिए यदि ऑब्जेक्ट की वर्तमान स्थिति के बाद कोई प्रॉपर्टी सेट या विधि कॉल उपयुक्त नहीं है। उदाहरण के लिए, एक System.IO.FileStream को लिखने के लिए जो खोला गया है उसे एक सिस्टम फेंकना चाहिए। अविश्वसनीय अपवाद अपवाद अपवाद।
संयोग से, InvalidOperationException
जब कार्रवाई अमान्य वस्तु की वर्तमान स्थिति के लिए है के लिए है। यदि ऑपरेशन पूरी कक्षा के लिए हमेशा अमान्य है, तो आपको NotSupportedException
का उपयोग करना चाहिए।
ध्यान रखें कि गुण भी सिंटेक्टिक शर्करा विधियां हैं। – Dykam
एक संबंधित रोचक चर्चा: http://stackoverflow.com/questions/1488472/best-practices-throwing-exceptions-from-properties – Joren