32

मैं एक कस्टम संग्रह कार्यान्वयन को कार्यान्वित कर रहा हूं जो या तो पढ़ा जा सकता है या पढ़ा जा सकता है; जो है, सब तरीकों कि संग्रह बदलने के एक समारोह है कि का नैतिक बराबर फोन:अवैधऑपरेशन अपवाद या NotSupportedException का उपयोग कब करें?

private void ThrowIfReadOnly() { 
    if (this.isReadOnly) 
     throw new SomeException("Cannot modify a readonly collection."); 
} 

मुझे यकीन है कि जो NotSupportedException या InvalidOperationException की मैं उस मामले में उपयोग करना चाहिए नहीं कर रहा हूँ।

उत्तर

43

MSDN केवल इस सटीक विषय पर मार्गदर्शन में से एक सा, पर NotSupportedException है:

जहां यह कभी कभी संभव है वस्तु अनुरोध किया कार्य करने के लिए परिदृश्यों के लिए, और वस्तु राज्य है कि ऑपरेशन निर्धारित करता है किया जा सकता है, InvalidOperationException देखें।

  • वस्तु के राज्य तो बदल सकते हैं कि कार्रवाई अमान्य/वस्तु के जीवनकाल के दौरान वैध बन सकता है, तो InvalidOperationException इस्तेमाल किया जाना चाहिए:

क्या इस प्रकार है विशुद्ध रूप से शासन के अपने ही व्याख्या है।

  • यदि पूरे ऑब्जेक्ट के जीवनकाल के दौरान ऑपरेशन हमेशा अमान्य/मान्य होता है, तो NotSupportedException का उपयोग किया जाना चाहिए।
  • उस स्थिति में, "जीवनकाल" का अर्थ है "पूरे समय कोई भी वस्तु का संदर्भ प्राप्त कर सकता है" - यानी Dispose() कॉल के बाद भी जो अक्सर अन्य उदाहरण विधियों को अनुपयोगी बनाता है;
    • मार्टिन लिवरेज द्वारा इंगित किए गए अनुसार, किसी ऑब्जेक्ट का निपटारा करने के मामले में, अधिक विशिष्ट ObjectDisposedException प्रकार का उपयोग किया जाना चाहिए। (यह अभी भी InvalidOperationException का एक उप प्रकार है)।
  • उस मामले में इन नियमों का व्यावहारिक अनुप्रयोग के रूप में निम्नानुसार होगा:

    • तो isReadOnly केवल (जैसे एक निर्माता तर्क) समय था जब वस्तु बनाई गई है पर सेट किया जा सकता है, और किसी भी अन्य समय कभी नहीं, तो NotSupportedException का उपयोग किया जाना चाहिए।
    • यदि isReadOnly ऑब्जेक्ट के जीवनकाल के दौरान बदल सकता है, तो InvalidOperationException का उपयोग किया जाना चाहिए।
      • हालांकि, InvalidOperationException बनाम NotSupportedException की बात वास्तव में एक संग्रह को लागू करने के मामले में विवादास्पद है - MSDN पर IsReadOnly का विवरण दिया, IsReadOnly के लिए ही अनुमति दी व्यवहार है कि अपने मूल्य कभी नहीं बदलता के बाद संग्रह आरंभ नहीं हो जाता है। इसका मतलब है कि एक संग्रह उदाहरण या तो संशोधित या केवल पढ़ने योग्य हो सकता है - लेकिन इसे प्रारंभिक समय में चुनना चाहिए और इसके बाकी जीवनकाल के लिए इसके साथ रहना चाहिए।
    +5

    एक निपटाए वस्तु पर एक विधि कॉलिंग 'ObjectDisposedException' बजाय' InvalidOperationException' के फेंक देना चाहिए, भले ही यह गलत ऑपरेशन है। –

    +3

    @ मार्टिन: ओह, अच्छा एक! मुझे 'ऑब्जेक्ट डिस्प्ले अपवाद' के बारे में बिल्कुल पता नहीं था।(और 'ऑब्जेक्टडिस्पेडएक्सप्शन' के रूप में 'अमान्यऑपरेशन एक्सेप्शन' का एक उप प्रकार है, यह 'अमान्य ऑपरेशन अपवाद' का एक विशेष मामला होने के साथ अच्छी तरह से संबंध रखता है) –

    +0

    कुछ इस बारे में क्या है: बूल कुछ विधि (param) { अगर (कुछ राज्य ए में पैरा) कुछ विशिष्ट चेक लौटें; अगर (कुछ राज्य बी में पैरा) एक और विशिष्ट जांच वापस करें; नया नोट्स समर्थित अपवाद(); } यदि किसी ने इस विधि को कॉल करते समय पहुंचा जा सकता है तो किसी अन्य संभावित स्थिति को जोड़ा जा सकता है, तो डेवलपर को कथन के बाद तीसरा जोड़ना चाहिए। इसलिए मेरे पास विधि की अंतिम पंक्ति तक पहुंचने के लिए एक समर्थित अपवाद नहीं है। तुम क्या सोचते हो? – Skychan

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