2011-03-09 11 views

उत्तर

9

दो कारण तुरंत दिमाग में वसंत:

  1. सीधे शब्दों में तो तुम try { ... } catch (Exception e) { ... } नहीं कहता - अपनी खुद की उपवर्गों होने आप अलग अपवाद मामलों में अलग से इलाज की सुविधा देता है। (जैसे एक रिपोर्ट चलाने की अनुमति नहीं है, और रिपोर्ट निष्पादन विफल होने के बीच अंतर)।
  2. आप अतिरिक्त संदर्भ जोड़ सकते हैं - उदाहरण के लिए यदि आपके पास अपना AlreadyLoggedInException है, तो कहें कि उस अपवाद में आईपी पता पुनर्प्राप्त करने का एक तरीका हो सकता है जिससे अन्य सत्र शुरू किया गया था। या AccountLimitExceededException में वर्तमान खाता सीमा हो सकती है। अपवाद में अतिरिक्त जानकारी आपको पकड़ने पर संभावित रूप से अधिक अच्छी तरह से सूचित प्रतिक्रिया लेने की अनुमति देती है।
+1

क्या आप कृपया इसके बजाय एक कामकाजी उदाहरण दे सकते हैं ताकि यह मेरे लिए स्पष्ट हो जाए? – Deepak

1

त्रुटि-विशिष्ट जानकारी प्रदान करना, अधिक बढ़िया अपवाद हैंडलर को अनुमति देना।

1

हां। बड़ा फायदा यह है कि यह आपको फेंकने और अपवादों की अनुमति देता है जिसका मतलब है कि आप चाहते हैं कि उनका मतलब हो। यदि आप किसी मौजूदा अपवाद का पुन: उपयोग करते हैं, तो अपवाद को पकड़ने वाले आपके कोड का कोई भी टुकड़ा इस संभावना से निपटने के लिए है कि वास्तविक अपवाद आपके कोड द्वारा नहीं फेंक दिया गया था, लेकिन कुछ अन्य लाइब्रेरी पार्टी कोड द्वारा। इससे अधिक फ्लेकी को संभालने में त्रुटि होती है।

0

कस्टम अपवाद के साथ, आप अपने कॉलर्स को बता सकते हैं कि एक त्रुटि की बजाय एक विशिष्ट प्रकार की त्रुटि हुई है। और कॉलर इस प्रकार की त्रुटि के लिए विशिष्ट कुछ भी नहीं कर सकते हैं।

चलिए एक कार समानता का उपयोग करते हैं: क्या आप अपनी कार को एक अद्वितीय लाल रोशनी झपकी से शुरू करने से मना कर सकते हैं, या एक समर्पित "गैस टैंक खाली" प्रकाश झपकी के साथ?

+1

मुझे पता है कि आप क्या कहने की कोशिश कर रहे हैं, लेकिन संदेशों के बारे में बात करना एक अच्छा सादृश्य नहीं है। अगर यह सिर्फ संदेश था, तो हम सभी नए अपवाद को फेंक सकते थे ("मैं शुरू नहीं करूँगा क्योंकि मैं गैस से बाहर हूं") –

+0

आप सही हैं। हमेशा के रूप में, एक कार समानता एक बहुत अच्छा समानता नहीं है। संदेशों के बारे में बात करने से बचने के लिए मैं अपनी पोस्ट संपादित करूंगा। –

2

काफी सरलता से, यह आपको सही तरीके से प्रत्येक अपवाद से निपटने की अनुमति देता है।

निम्नलिखित कोड पर विचार करें

try { 
    doSomethingThatCouldThrowManyExceptions(); 

} 
catch (ExceptionalCircumstance1 ex) { 
    // deal with this specific circumstance 
} 
catch (ExceptionalCircumstance2 ex) { 
    // deal with this specific circumstance 
} 
catch (ExceptionalCircumstance3 ex) { 
    // deal with this specific circumstance 
} 
finally { 
    // do some common code 
} 

इस के बिना, आप एक कैच-ऑल अपवाद के प्रकार करने का प्रयास कर रह जायेंगे।

यदि हालांकि कैच-सब कुछ करेंगे, तो कक्षा पदानुक्रम का अभी भी मतलब है कि आप अभी भी catch(Exception ex) {} का उपयोग करके सभी अपवादों को पकड़ सकते हैं।

+0

आप कक्षाओं को असाधारण Circumstance2 और ExceptionalCircumstance3 में बदलना चाहेंगे ;-) – perdian

+0

अच्छा बिंदु! कॉपी-एंड-पेस्ट एंटी पैटर्न फिर से जीतता है। – Codemwnci

0

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

एक और बिंदु यह है कि यह सिस्टम के विभिन्न हिस्सों के लिए बेहतर अमूर्तता प्रदान कर सकता है। उदाहरण के लिए, यदि आप वास्तव में उम्मीद करते हैं कि भविष्य में दृढ़ता भाग का कार्यान्वयन बदल जाएगा, तो इसके एपीआई में कस्टम अपवादों का उपयोग करना बेहतर होगा।अन्यथा आपको बाद में कई अलग-अलग स्थानों में एसक्यूलेक्सप्शन या SAXExceptions से निपटने में बहुत मज़ा आएगा :-)

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