2012-05-02 7 views
7

मुझे एक आवश्यकता है जहां अपवाद फेंकने के बाद भी प्रोग्राम निष्पादन प्रवाह जारी रखना चाहिए।अपवाद फेंकने के बाद भी प्रोग्राम निष्पादन जारी रखने के लिए कैसे?

for(DataSource source : dataSources) { 
    try { 
     //do something with 'source' 
    } catch (Exception e) { 
    } 
} 

यदि पहले पुनरावृत्ति में अपवाद फेंक दिया जाता है, तो प्रवाह निष्पादन रोक दिया जाता है। मेरी आवश्यकता पहले पुनरावृत्ति के लिए अपवाद फेंकने के बाद भी है, अन्य पुनरावृत्तियों को जारी रखना चाहिए। क्या मैं पकड़ ब्लॉक में तर्क लिख सकता हूं?

+2

आपके पास अब तर्क है कि यह ठीक है। यदि अपवाद 'डेटासोर्स' को अमान्य स्थिति में रखता है, तो इटरेटर का उपयोग करने का अगला प्रयास एक अलग अपवाद फेंक सकता है। –

उत्तर

-3

नहीं, अपवाद को संभालने के लिए कोई भाषा समर्थन नहीं है और उसके बाद उस कथन पर वापस कूदना है जिसके कारण यह हुआ। आपको ऑपरेशन के हर बाद के आसपास अलग-अलग try...catch संरचनाएं लपेटनी होंगी, जो पिछले बाद के बाद अपवाद को फेंकने के बावजूद निष्पादित होनी चाहिए।

+1

* "नहीं, अपवाद को संभालने के लिए कोई भाषा समर्थन नहीं है और फिर उस कथन पर वापस कूद रहा है जिसके कारण यह हुआ।" * यह नहीं पूछा गया था। पूछा गया था कि *** अन्य *** पुनरावृत्तियों को जारी रखने की अनुमति कैसे दी जाए। –

+0

^सच। मुझे लगता है कि वह जो चाहता है वह कुछ ऐसा है: 'पकड़' के बाद 'आखिरकार' जोड़ें और जहां से पुनरावृत्ति दुर्घटनाग्रस्त हो वहां से पुनरावृत्ति जारी रखें। यद्यपि यह एक कामकाज हो सकता है, यह अनुशंसित नहीं है और करने के लिए बहुत बदसूरत है। –

6

यदि आप कैच ब्लॉक के अंदर किसी भी तरह लूप तोड़ नहीं रहे हैं, तो अन्य पुनरावृत्ति अभी भी जारी रहेगी, भले ही पिछले पुनरावृत्ति में कोई अपवाद डाला गया हो।

इस सरल उदाहरण की कोशिश करो और देखो क्या होता है:

List<String> list = new ArrayList<String>(); 
list.add("1"); 
list.add("2"); 
list.add("3"); 

for(String str: list) { 
    try { 
     System.out.println(str); 
     throw new Exception("Exception for string " + str); 
    } catch(Exception ex) { 
     System.out.println("Caught exception"); 
    } 
} 

आप देखेंगे कि सभी यात्रा पर अमल देखेंगे, भले ही हर एक को एक अपवाद फेंकता है।

+0

हाय ट्यूडर, आपके उत्तर के लिए धन्यवाद। मैं समझ गया। मुझे अंततः ब्लॉक का स्थान भी रखना होगा जिसे सभी पुनरावृत्तियों के बाद बुलाया जाएगा। इसे हर पुनरावृत्ति के लिए नहीं बुलाया जाना चाहिए। मैं इसे कैसे प्राप्त कर सकता हूं? कृपया मेरी मदद करें! – user1016403

+0

@ user1016403: उस स्थिति में आपको पूरे प्रयास में 'लूप ... अंत में' ब्लॉक में लपेटने की आवश्यकता होगी: 'try {... ({}}} अंत में {} ' – Tudor

0

आपके पास अब तर्क है कि यह ठीक है। यदि अपवाद DataSource को अमान्य स्थिति में डालता है, तो इटरेटर का उपयोग करने का अगला प्रयास एक अलग अपवाद फेंक सकता है, लेकिन यह एक अलग मामला है और DataSource के लिए विशिष्ट कुछ है (इसलिए आपको यह देखना होगा कि DataSource आपको सौदा करने के लिए कुछ करने देता है या नहीं किसी अन्य तरीके से उस अन्य अमान्य स्थिति के साथ)। लेकिन सामान्य मामले में, आप इसे सही कर रहे हैं।

9

खैर सब से पहले,

अपवाद के 2 प्रकार के होते हैं। चेक किया गया & अनचेक किया गया।

अनचेक अपवाद वे हैं जिनसे आपका प्रोग्राम पुनर्प्राप्त नहीं हो सकता है। नलपॉइंटर्स की तरह, आपको बता रहा है कि आपके तर्क के साथ कुछ वास्तव में गलत है।

चेक किए गए अपवाद रनटाइम अपवाद हैं, और इनसे आप पुनर्प्राप्त कर सकते हैं।

इसलिए आपको "अपवाद" बेस क्लास की तलाश में पकड़ राज्यों का उपयोग करने से बचना चाहिए। जो दोनों बार प्रतिनिधित्व करते हैं। आपको शायद विशिष्ट अपवादों (आमतौर पर रन-टाइम अपवादों के उप-वर्ग) की तलाश करने पर विचार करना चाहिए।

संक्षेप में, इसमें बहुत कुछ है।

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

for(DataSource source : dataSources) { 
    try { 
     //do something with 'source' 
    } catch (Exception e) { // catch any exception 
     continue; // will just skip this iteration and jump to the next 
    } 
    //other stuff ? 
} 

यह है, यह अपवाद को पकड़ने और आगे बढ़ने चाहिए:

अब, आप कोड पर विचार। शायद कुछ ऐसा नहीं है जो आप हमें नहीं बता रहे हो? : पी

वैसे भी, उम्मीद है कि इससे मदद मिलती है।

1

एक अपवाद है, जबकि dataSources बुला इटरेटर, तो कि अपवाद पकड़ा जा नहीं होगा प्रारंभ करने में for(DataSource source : dataSources) पर होता है।

क्या आपका मतलब है "यदि पहले पुनरावृत्ति में अपवाद फेंक दिया गया है, तो प्रवाह निष्पादन रोक दिया गया है।"?

यदि ऐसा है, तो आप ऐसा कुछ भी नहीं कर सकते हैं और लूप किसी भी इंटरैक्शन को निष्पादित नहीं करना चाहिए।

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