2010-03-18 16 views
6

मैंने किसी को यह उल्लेख किया था कि सभी अपवादों को पकड़ना आवश्यक रूप से अच्छा अभ्यास नहीं है (उदाहरण के लिए, NullPointerException)। मैं यह जानना चाहता हूं कि यह एक अच्छी बात है, जब यह नहीं है, और ऐसा क्यों है: डीकोड में अपवादों की जांच कर रहा है या जावा में बेहतर अभ्यास करने का प्रयास कर रहा है?

धन्यवाद !!

badPanda

उत्तर

3

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

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

यह सच में 100% सही नहीं है, लेकिन सामान्य दृष्टिकोण के रूप में यह जावा में विशेष रूप से काम करता है।

5

संक्षेप में:

जांचे हुए अपवादों

अनियंत्रित अपवाद और त्रुटियों को पकड़ने के लिए बुलबुला अप करने के लिए छोड़ा जा सकता है कर रहे हैं। (ये RuntimeException और Error के उप-वर्ग हैं)।

ऐसा इसलिए है क्योंकि चेक अपवाद "अपेक्षित" हैं और कार्यक्रम उनसे पुनर्प्राप्त हो सकता है। अनचेक अपवाद ऐसे हैं जिनसे प्रोग्राम पुनर्प्राप्त नहीं हो सकता है (आसानी से)।

Sun's tutorial कहते हैं (यह निर्णय लेने से आप अपवाद किस तरह बनाना चाहिए के बारे में है, लेकिन यह भी दूसरे पक्ष पर जानकारीपूर्ण है - यानी जब अपवाद का उपयोग कर):

यहाँ लब्बोलुआब यह दिशानिर्देश है: यदि एक ग्राहक कर सकते हैं उचित रूप से अपवाद से पुनर्प्राप्त होने की उम्मीद की जा सकती है, इसे एक अपवाद अपवाद बनाएं। यदि कोई ग्राहक अपवाद से पुनर्प्राप्त करने के लिए कुछ भी नहीं कर सकता है, तो इसे एक अनचेक अपवाद बनाएं।

+0

"अनियंत्रित अपवाद ऐसे है जहाँ से कार्यक्रम (आसानी से) वापस नहीं ले पाता है।" नहीं, 'त्रुटि' ऐसे हैं जिनसे प्रोग्राम आसानी से ठीक नहीं हो सकता है। अन्य 'रनटाइम अपवाद' के साथ निपटाया जा सकता है, लेकिन आमतौर पर ऐसी चीजें हैं जिन्हें कोड में से बचा जा सकता है, जैसे 'नलपॉन्टरएक्सप्शन'। – Powerlord

+0

@powerlord - मेरा अपडेट देखें – Bozho

2

और bozho के जवाब में जोड़ने से, यह कभी कभी आवेदन के प्रकार पर के रूप में अच्छी तरह से, आप के रूप में कुछ मामले में निर्भर करता है कि आप इसे उस के लिए आसपास कुछ काम करने के लिए संभाल करने के लिए हो सकता है, और कुछ मामले में आप इसे छोड़ सकते हैं कॉलर द्वारा संभालने या अंततः समाप्त करने के लिए।

1

अपवाद जो प्रोग्रामिंग त्रुटियों के कारण नहीं हैं और/या पुनर्प्राप्त किए जा सकते हैं, उन्हें पकड़ा जाना चाहिए। दूसरों को नहीं होना चाहिए। जावा में आम तौर पर जांच की जाती है अपवादों को पकड़ा जाना चाहिए जबकि रनटाइम अपवाद और त्रुटियां नहीं हैं।

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

2

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

यदि यह आसान है, तो निश्चित रूप से एक त्रुटि की जांच करें और प्रयास-प्रयास का उपयोग करने के बजाय इसके साथ सौदा करें।उदाहरण के लिए, यदि आप इसे चेक करके अमान्य इनपुट से निपट सकते हैं और "कृपया पुनः प्रयास करें" संदेश टाइप कर रहे हैं, तो आप एक कोशिश-पकड़ का उपयोग नहीं करेंगे।

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

1

RuntimeExceptions (अधिकांश मामलों में) "प्रोग्रामिंग त्रुटियों" माना जा सकता। उदाहरण के लिए, किसी ऑब्जेक्ट को वास्तव में कोई तत्व शामिल करने से पहले किसी ऑब्जेक्ट को स्टैक से पॉप करने का विचार करें। उचित कार्यान्वयन में, स्टैक की स्थिति की जांच करने के लिए कुछ लक्षण() विधि दी जानी चाहिए। यदि प्रोग्रामर आलसी है या ढेर की जांच करना भूल जाता है, तो प्रोग्रामिंग त्रुटि को इंगित करने के लिए एक अपवाद फेंक दिया जाना चाहिए।

अपवाद के इन प्रकार के नहीं पकड़ा जाना चाहिए। विचार कार्यक्रम को दुर्घटनाग्रस्त करना और प्रोग्रामर को उसकी गलती को सूचित करना है।

दूसरी ओर जांचे हुए अपवादों, के रूप में दूसरों ने कहा है, अपवाद है जहाँ से कार्यक्रमों से ठीक होने की उम्मीद है। हालांकि यह अभ्यास में एक अच्छा विचार की तरह लगता है, जब आप अपवाद के कारण को हल करने के लिए वास्तव में कुछ भी नहीं कर सकते हैं तो अपवादों को अक्सर हटा दिया जाता है। तो आप बहुत सारे बॉयलरप्लेट कोड (यानी कोशिश-पकड़-ब्लॉक के साथ समाप्त होते हैं, जिनके अपवाद ब्लॉक कुछ भी नहीं करते हैं लेकिन अपवाद के कारण को लॉगिंग या प्रिंट करते हैं)। अफैइक, कोई भी नई प्रोग्रामिंग भाषा इस वजह से चेक अपवादों का समर्थन नहीं करती है (यहां तक ​​कि जावाएफएक्स)।

0

मैं हमेशा लागू एक try...catch(Throwable) (एक फेंकने योग्य सही मायने में एक त्रुटि है और आपके आवेदन किसी भी आगे की कार्रवाई करने नहीं करना चाहिए के बाद यह उन में से एक मिल) मेरे कोड में एक बिंदु पर, जब यह अत्यंत महत्वपूर्ण है पता है कि तो यह हुआ लॉग किया जा सकता है वह जगह आमतौर पर main विधि है।

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

अंगूठे का नियम यह है कि यदि आप इसके बारे में कुछ करने जा रहे हैं (या तो किसी चीज की प्रसंस्करण को रोकें, वैकल्पिक दिनचर्या चलाएं, या आगे बढ़ें, जब तक आप जानते हों कि आप क्या कर रहे हैं), अगर आप इसके बारे में कुछ नहीं करने जा रहे हैं, तो इसे पकड़ो मत।

और अपने अपवाद को छिपाने के लिए अपने आईडीई try...catch निर्माता का उपयोग न करें, इसके बजाय इसे विधि हस्ताक्षर में अपवाद जोड़ें।

+0

क्या आपका मतलब त्रुटि है? एक अपवाद/रनटाइम अपवाद भी एक थ्रोबल है। – helpermethod

+0

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

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