सार अपवाद सुपर प्रकार


17

अगर फेंकना System.Exceptionइतना बुरा माना जाता है, तो पहले स्थान पर क्यों नहीं Exceptionबनाया abstractगया?

इस तरह, कॉल करना संभव नहीं होगा:

throw new Exception("Error occurred.");

यह हुई त्रुटि का अधिक विवरण प्रदान करने के लिए व्युत्पन्न अपवादों का उपयोग करते हुए लागू होगा।

उदाहरण के लिए, जब मैं पुस्तकालय के लिए एक कस्टम अपवाद पदानुक्रम प्रदान करना चाहता हूं, तो मैं आमतौर पर एक अपवाद के लिए एक सार आधार वर्ग घोषित करता हूं:

public abstract class CustomExceptionBase : Exception
{
    /* some stuff here */
}

और फिर एक अधिक विशिष्ट उद्देश्य के साथ कुछ व्युत्पन्न अपवाद:

public class DerivedCustomException : CustomExceptionBase
{
    /* some more specific stuff here */
}

फिर किसी भी लाइब्रेरी मेथड पर कॉल करते समय, किसी को भी लाइब्रेरी से आने वाली किसी भी त्रुटि को पकड़ने के लिए यह सामान्य प्रयास / कैच ब्लॉक हो सकता है:

try
{
    /* library calls here */
}
catch (CustomExceptionBase ex)
{
    /* exception handling */
}

क्या यह अच्छा अभ्यास है?

क्या यह अच्छा होगा अगर Exceptionइसे अमूर्त बनाया गया?

संपादित करें: मेरा कहना यह है कि भले ही एक अपवाद वर्ग को चिह्नित किया जाए abstract, फिर भी आप इसे कैच-ऑल ब्लॉक में पकड़ सकते हैं। इसे अमूर्त बनाना केवल प्रोग्रामरों को "सुपर-वाइड" अपवाद को फेंकने के लिए मना करने का एक तरीका है। आमतौर पर, जब आप स्वेच्छा से एक अपवाद फेंकते हैं, तो आपको पता होना चाहिए कि यह किस प्रकार का है और ऐसा क्यों हुआ। इस प्रकार एक अधिक विशिष्ट अपवाद प्रकार फेंकने के लिए लागू करना।


3
+1 "गलत उपयोग को रोकने का सबसे अच्छा तरीका है कि ऐसे उपयोग को असंभव बना दिया जाए।" - स्कॉट मेयर्स
स्टीवन ज्यूरिस

3
"यदि अपवाद को अमूर्त बनाया जाता तो क्या यह अच्छा होता?" - पूरी तरह से नहीं, क्योंकि मौजूदा सभी .NET कोड जो नए अपवाद ("...") का उपयोग करते हैं, वे टूट जाएंगे। हालाँकि, "क्या .NET टीम को अपवाद शुरू करना चाहिए?" - शायद, हाँ, लेकिन यह> अब 10 साल बहुत देर हो चुकी है :)
मैटवेवी

जवाबों:


11

मैं वास्तविक कारणों को नहीं जानता कि यह इस तरह क्यों किया गया था, और एक सर्टिफिकेट डिग्री से मैं सहमत हूं कि अनैतिक रूप से व्यापक अपवादों को फेंकने से रोकना एक अच्छी बात होगी।

लेकिन ... जब छोटे डेमो एप्स या प्रूफ-ऑफ-कॉन्सेप्ट्स को कोड करना, मैं 10 अलग-अलग अपवाद उप-वर्गों को डिजाइन करना शुरू नहीं करना चाहता हूं, या यह तय करने में समय बिताना चाहता हूं कि स्थिति के लिए "सर्वश्रेष्ठ" अपवाद वर्ग कौन सा है। मैं केवल एक थ्रो Exceptionऔर थ्रू पास करना चाहता हूं जो विवरण बताता है। यह फेंकने-दूर कोड, मैं इन बातों की परवाह नहीं करते जब और अगर मैं था मजबूर ऐसी बातों के बारे में देखभाल करने के लिए, मैं या तो अपने ही बनाएंगे, GenericExceptionवर्ग और फेंक कि हर जगह, या एक अलग उपकरण / भाषा में चले जाने के। कुछ परियोजनाओं के लिए, मैं मानता हूं कि प्रासंगिक अपवाद उपवर्गों को ठीक से बनाना महत्वपूर्ण है, लेकिन सभी परियोजनाओं की आवश्यकता नहीं है।


मैं आपसे पूरी तरह सहमत हूं, लेकिन सवाल गैर-तुच्छ परियोजनाओं के बारे में था।
मार्को-फिसेट

3

संभावना A: यह तार्किक रूप से सही है।

आप सही हैं कि Microsoft, कई अन्य लोगों के साथ-साथ new Exception()कारणों की अधिकता के लिए सीधे फेंकने का सुझाव नहीं देता है।

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

अपवाद वर्ग कोई अपवाद नहीं है (न कि इच्छित उद्देश्य)। यह एक व्यापक संभव अपवाद होने का इरादा है, एक "सुपर अपवाद" जो लगभग पकड़ा नहीं जा सकता क्योंकि इसका दायरा असीम रूप से व्यापक है। 'अपवाद' abstractइस अर्थ में नहीं है कि अपवाद स्वयं एक इकाई के रूप में मौजूद नहीं हो सकता है। यह (हालांकि माना जाता है कि अच्छे मामलों को अभी तक परिभाषित नहीं किया गया है - संभावना बी देखें), और इसलिए सार्वजनिक रूप से रचनात्मक होना चाहिए।

'अमूर्त' कीवर्ड (विशुद्ध शैक्षणिक अर्थ में) केवल तभी लागू होता है जब आधार वर्ग अपने आप में कोई अर्थ नहीं रखता है - यानी FourLeggedAnimal

यह सब ध्यान में रखते हुए, कोई भी तकनीकी कारण नहीं होगा, जो कि अन्य डेवलपर्स के विकास का एक स्रोत होने के अलावाabstract , वर्ग बनाने के लिए भी होगा

संभावना B: डिज़ाइन लॉक-इन / वे नहीं जानते थे

यदि एमएस ने इस वर्ग को अमूर्त बना दिया है, तो वे मुसीबत में पड़ सकते हैं यदि उन्होंने अपना दिमाग सड़क पर बदल दिया, क्योंकि यह वर्ग भाषा के मूल सिद्धांतों के लिए बहुत आवश्यक है। वे पहले से ही नासमझ थे ApplicationException, इसलिए यह ध्यान देने योग्य है कि उन्होंने सड़क के नीचे की सिफारिश में बदलाव का अनुमान लगाया था। (देखें http://blogs.msdn.com/b/kcwalina/archive/2006/06/23/644822.aspx )

अन्य कारण भी हो सकते हैं (मैं सोच रहा हूं कि शायद रिफ्लेक्शन, या कुछ अन्य तकनीकी कारणों से ऐसा करना है), इसलिए मैं इस पद को सीडब्ल्यू बना रहा हूं।


"सिर्फ इसलिए कि यह" सुपर-वाइड "है, यह सार नहीं है।" ... लेकिन यह ओपी का तर्क नहीं है। क्या यह इस मायने में सारगर्भित नहीं होना चाहिए कि अपवाद के प्रकार के कुछ संकेत हमेशा पारित करने की आवश्यकता होती है।
स्टीवन ज्यूरिस

अच्छा बिंदु, मैं अपने उत्तर को तदनुसार अपडेट करूंगा - इस प्रश्न की प्रकृति थोड़ी भ्रमित करने वाली है क्योंकि 'एब्सट्रैक्ट' भाषा का एक कीवर्ड है और साथ ही साथ इस अवधारणा का नाम है जिस पर चर्चा की जा रही है।
केविन मैककॉर्मिक

@KevinMcCormick: यहां 'अमूर्त' शब्द का प्रयोग भाषा के कीवर्ड के रूप में किया जाता है। कृपया मुझे बताएं कि मैं अपना प्रश्न कैसे बदल सकता हूं ताकि यह भविष्य के पाठकों के लिए स्पष्ट हो?
मार्को-फिसेट

मुझे लगता है कि यह एक बड़ा सवाल है। abstractकीवर्ड के संबंध में कोई भी OO रूपांतरण इस दीवार को हिट करता है। abstractबैकटिक्स के साथ कीवर्ड को दर्शाने के अलावा इसके चारों ओर जाने के किसी भी तरीके के बारे में सुनिश्चित नहीं है ।
केविन मैककॉर्मिक

2
"डिसएब्रेटिंग" एक वर्ग को एक तोड़ने वाला बदलाव कैसे है?
विन्यासकर्ता
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.