2017-04-17 4 views
5

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

private void something(String name) throws IOException, RemoteException { 
    try { 
     ... 
    } catch (Exception ex) { 

     ... // do something 

     throw ex; 
    } 
} 
+1

यद्यपि सामान्य अपवाद का उपयोग करना एक बुरा अभ्यास है। [यहां] देखें (http://stackoverflow.com/questions/2416316/why-is-the-catchexception-almost-always-a-bad-idea)। – Enzokie

+0

क्या यह प्रश्न अस्पष्ट और राय आधारित दोनों नहीं है? –

उत्तर

3

आप यह कर सकते हैं यदि आप इस विधि है कि किसी भी अपवाद इसके निष्पादन के दौरान फेंक दिया उसी तरह से संभाला जाना चाहिए के लिए विचार और आपको इसकी सूचना देने ग्राहक

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

+0

ठीक है, धन्यवाद। लेकिन क्या मैं एक और सवाल पूछ सकता हूं? आइए मान लें कि एक नलपोइंटर एक्सेप्शन फेंक दिया गया है और पकड़ से खरीदा गया है। क्या यह अपवाद भी कॉलिंग मेथोड पर फेंक दिया जाएगा, क्योंकि फेंकने वाले खंड में केवल आईओ- और रिमोट अपवाद का उल्लेख किया गया है? जर्मनी से ग्रीटिंग – LaBlum

+0

आपका स्वागत है। बहुत दिलचस्प सवाल है। 'NullPointerException' एक 'RuntimeException' है। इस तरह के अपवाद को विधि घोषणा में स्पष्ट रूप से घोषित करने की आवश्यकता नहीं है। आप इसे पकड़ने या इसे फेंकने के तरीके को घोषित किए बिना इसे फेंक सकते हैं। 'IOException' और 'RemoteException' के विपरीत जो अपवाद चेक किए गए हैं। ये आखिरी बार 'अपवाद' से निकलते हैं और 'रनटाइम अपवाद' से नहीं। – davidxxx

+0

यह सच है ... मैंने उस पर विचार नहीं किया। और क्या होगा यदि एक अवैध ArgumentException फेंक दिया गया है, उदाहरण के लिए क्योंकि मैं एक स्ट्रिंग एक int-variable में स्टोर करना चाहता था? क्या इसे कॉलिंग विधि में फेंक दिया जाएगा, हालांकि फेंकने वाले खंड में इसका उल्लेख नहीं किया गया है? – LaBlum

3

ReThrow

जब भी आप अपवाद के बारे में फोन करने वाले विधि सूचित करना चाहते हैं, तो आप को पकड़ने और rethrow अपवाद।

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

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

मल्टी पकड़

आप अपवाद एक से अधिक प्रकार के लिए एक ही काम करवाना चाहते हैं, तो आप बहु पकड़ का उपयोग करें।

2

आप दे अपवाद विधि छोड़ से पहले निम्न परिस्थितियों में rethrow की आवश्यकता होगी

  1. आप preprocess कुछ करना चाहते हैं। हालांकि, अगर आपको अपवाद के प्रकार की परवाह नहीं है तो प्रीप्रोकैसिंग finally ब्लॉक में भी किया जा सकता है।
  2. आप चेक किए गए अपवादों को अनचेक अपवाद में रूपांतरित करने का प्रयास कर रहे हैं। उस स्थिति में आप catch(Exception ex) के रूप में सभी अपवादों को पकड़ लेंगे और उन्हें throw new RuntimeException(ex) के रूप में पुनर्स्थापित करेंगे।
  3. आप अपने कस्टम अपवाद को निर्मित लोगों के बजाय फेंकना चाहते हैं। तो आप सभी अपवादों को पकड़ लेंगे और फिर अपनी खुद की अपवाद वस्तु को अधिमानतः अनचेक करें और उसे फेंक दें। कई एपीआई ऐसा करते हैं, उदाहरण के लिए वसंत वसंत कस्टम अपवादों के लिए अपूर्ण JDBC अपवादों को परिवर्तित करता है।
  4. यह एक तरह का प्रीप्रोकैसिंग जैसा है। आप एक ArrayList या कुछ बनाकर फेंकने वाले सभी अपवादों का ट्रैक रखना चाहते हैं, ताकि कई चरणों वाले प्रोग्राम के अंत में आप जान सकें कि कौन से कदम अपवाद फेंकते हैं। मैंने इसे Talend जेनरेट किया गया जावा कोड में इस्तेमाल किया है।
संबंधित मुद्दे