2010-07-29 14 views
5

क्या यह संभव है कि एक अपवाद वस्तु अपनी आंतरिक त्रुटि के कारण एक और अपवाद उठा रही हो?क्या यह संभव है कि एक अपवाद वस्तु अपनी आंतरिक त्रुटि के कारण एक और अपवाद उठा रही हो?

प्रयास-पकड़ में मान लें कि हम अपवाद वस्तु को तुरंत चालू करते हैं, क्या यह एक और अपवाद बढ़ाने के लिए तत्काल है? यदि हां, तो हमें अनजाने में कोशिश करने वाले ब्लॉक को घोंसला करना चाहिए जो बहुत मजेदार दिखता है।

+0

क्या आप अपना प्रश्न साफ़ कर सकते हैं। क्या यह अपवाद नया/बनाया गया है? क्या यह पकड़ ब्लॉक में है? –

+0

कृपया ऊपर मेरा संशोधन देखें। धन्यवाद। – xport

+1

दिमाग में सावधान रहें। सभी अपवाद नहीं हो सकते हैं और उन्हें संभाला जाना चाहिए। कुछ गलत तर्क या बग के लिए संकेत हैं। –

उत्तर

3

संक्षेप में, जवाब हाँ है, यह संभव है।

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

अपवाद किसी भी अन्य वर्ग की तरह हैं और स्वयं अपवाद फेंक सकते हैं। उस भाषा में कुछ भी नहीं है जो इसे अस्वीकार करता है।

हालांकि, मैं कहूंगा कि एक अपवाद वर्ग से अपवाद फेंकना यह बुरा अभ्यास है और आम तौर पर इससे बचा जाना चाहिए।


अपडेट: (अद्यतन सवाल के बाद)

आप एक try ब्लॉक में एक अपवाद वस्तु instantiating रहे हैं, तो catch वे इसके शिकार हो (यह मानते हुए यह अपवाद का उपयुक्त प्रकार पकड़ता)। यदि आप इसे catch ब्लॉक में तुरंत चालू कर रहे हैं, तो आप इसे नेस्टेड try{}catch{} में करना चाहेंगे - यह कैच ब्लॉक में उपयोग किए जाने वाले कोड के लिए काफी सामान्य है जो अपवाद फेंक सकता है।

जैसा कि अन्य ने कहा है - कुछ अपवादों को पकड़ा नहीं जाना चाहिए (उदाहरण के लिए OutOfMemory या अप्रत्याशित StackOverflow), क्योंकि आपके पास उनसे निपटने का कोई तरीका नहीं है।

+0

किस मामले में यह संभव है? – xport

+0

@xport - मैंने एक उदाहरण दिया था। किसी भी मामले में, आप स्वयं एक अपवाद वर्ग लिख सकते हैं और इसमें 'अपवाद' फेंक सकते हैं। अपवाद केवल कक्षाएं हैं, और सभी वर्ग के नियमों का पालन करते हैं। – Oded

2

हां - निश्चित रूप से एक अपवाद उठाने के लिए अपवाद के लिए संभव है।

हालांकि, फ्रेमवर्क अपवादों के अधिकांश (सभी नहीं) बहुत कम आंतरिक तर्क के साथ बहुत हल्के चीजें हैं, इसलिए औसत अपवाद में अपवाद उत्पन्न करने के लिए शायद बहुत अधिक गुंजाइश नहीं है।

क्या यह एक फ्रेमवर्क अपवाद है जिसे आप इस व्यवहार को देख रहे हैं? क्या आप हमें कुछ विवरण दे सकते हैं?

Reflector जैसे टूल के साथ अपवाद के आंतरिक पर एक त्वरित रूप से आपको यह देखने में मदद मिल सकती है कि क्या कुछ भी हो रहा है।

1

हाँ। यह संभव है।

लेकिन मुझे आश्चर्य है कि कोई ऐसा क्यों करना चाहेगा? अपवाद केवल डिजाइन द्वारा व्यावहारिक रूप से त्रुटियों को संप्रेषित करने के लिए हैं, उनके पास कोई गंभीर कोड या तर्क नहीं हो सकता है जो अपवाद का कारण बन सकता है। यदि आप तर्क दे रहे हैं, तो हो सकता है कि आप डेटाबेस या डिस्क में अपवाद को लॉग इन करना चाहें जो कुछ स्थितियों में अपवाद का कारण बन सकता है, तो मैं catch ब्लॉक में अपवाद लॉग इन होने के बाद भी इससे सहमत नहीं हूं।

2

हां, यह संभव है हालांकि बहुत सामान्य नहीं है। अगर अपवाद को फेंकने में कन्स्ट्रक्टर में कोई त्रुटि है, या गुम वर्गों पर निर्भर करता है, तो यह स्वयं एक अपवाद फेंक देता है।

यह परीक्षण करना आसान है: अपना स्वयं का अपवाद बनाएं जो किसी विधि को एक शून्य संदर्भ कॉल करने का प्रयास करता है। जब आप अपवाद को तुरंत चालू करते हैं, तो यह एक NullReferenceException फेंक देगा।

1

यदि आप सोच रहे हैं कि अपवाद वस्तु को स्थिति को संभालने का प्रयास करना चाहिए और यदि आप गलत नहीं हैं तो एक और अपवाद फेंकना चाहिए।
पकड़ ब्लॉक को गलत स्थिति को संभालना चाहिए और अगर ऐसा नहीं कर सकता है तो अपवाद को और दूर फेंक देना चाहिए।
उदाहरण:

try 
{ 
    BigResource r = new BigResource(); 
} 
catch(BigResourceException e) 
{ 
    bool cannotHandle = false; 
    // Handle exception here 

    if (cannotHandle) 
     throw e; 
} 
संबंधित मुद्दे