2010-01-15 9 views
5

ठीक है मैं ने पाप किया है, मैं इसRefactor अपवाद संचालन

try { 
    // my code 
} catch (Exception ex) { 
    // doesn't matter 
} 

की तरह बहुत ज्यादा कोड लिखा था अब मैं सफाई/refactor इस लिए जा रहा हूँ।

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

क्या आप एनबीबी को सभी अपवाद प्रकार के लिए फिर से देखने का तरीका जानते हैं और उन्हें को संभालने का प्रस्ताव बनाते हैं और फिर कोड पूर्ण करने के लिए प्रस्ताव बनाते हैं?

उत्तर

1

जब आप को अपवाद को संभालने के लिए पर एक प्रस्ताव के लिए पूछना ...

कोई आम तौर पर उन्हें संभालने के लिए जिस तरह से स्वीकार किया जाता है। अन्यथा, आप शर्त लगाते हैं कि जावा भाषा में उस व्यवहार को स्पष्ट रूप से होगा।

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

अपवाद, दो रूपों में मौजूद डिजाइन द्वारा:

  • जांचे हुए अपवादों प्रत्येक विधि है कि उन्हें फेंक कर सकते हैं में स्पष्ट किया जाना चाहिए।
  • अनचेक अपवाद (रनटाइम अपवाद या त्रुटि के उप-वर्ग) आमतौर पर निहित होते हैं।

प्रत्येक स्तर के कोड (विधि या ब्लॉक) पर, कोड को चुनना है कि किसी भी अपवाद की स्थिति में, अनचेक अपवादों को छोड़कर जो उपचार पूरी तरह से छोड़ सकते हैं)।

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

जावा भाषा, आप अपने वास्तुकला में अपवाद पर विचार आमतौर पर आप अपवाद को संभालने के लिए आसान बनाने के विशिष्ट वाक्यविन्यास, विशिष्ट अपवाद की पकड़ जैसे अधिक सामान्य लोगों का पालन किया है की सुविधा देता है ...


, और कुछ डिजाइन निर्णय लें। कुछ उदाहरण (अनूठे तरीके में मिश्रित):

  • एक परत प्रक्रिया है चुन सभी अपवादों को निचली परतों में फेंक दिया (पूर्व: लेन-देन संबंधी सेवाओं): developper के लिए प्रवेश, उपयोगकर्ता के लिए कुछ वैश्विक सूचना positionning ...
  • कुछ अपवाद कुछ विधि कॉल तक जाते हैं जब तक कि आप उस कोड में नहीं पहुंच जाते, जहां इसे संसाधित करना अर्थपूर्ण होता है (उदाहरण के लिए, आपके अपवादों के आधार पर, आप एक पूर्ण ऑपरेशन पुनः प्रयास कर सकते हैं या उपयोगकर्ता को सूचित कर सकते हैं ...)
  • आदि
3

समस्या यह है कि आपके पकड़ने वाले सभी हैंडलर सभी अपवादों को "हैंडल" करते हैं, इसलिए नेटबीन्स को और संकेत दिखाने की आवश्यकता नहीं है।

यदि आपके अपवाद हैंडलर पहले ही खाली हैं और आप उन्हें फिर से प्रतिक्रिया देने की योजना बना रहे हैं, तो आप उन्हें अस्थायी रूप से हटा सकते हैं।

युक्ति: अपने कोड को स्वत: प्रारूपित करें, try के लिए खोजें और catch मिलान मिलान करने के लिए ब्रैकेट हाइलाइटिंग का उपयोग करें। फिर सभी हैंडलिंग कोड हटा दें।

उसके बाद नेटबीन संभावित अपवादों को संभालने के लिए विभिन्न कार्यों का प्रस्ताव देंगे।

पीएस: सावधान रहें, नेटबीन्स की डिफ़ॉल्ट हैंडलिंग (यानी लॉगिंग) हमेशा सर्वोत्तम विकल्प नहीं है।

+0

नोट, यह किसी भी 'रनटाइम अपवाद' के लिए काम नहीं करेगा। –

1

मैं सिर्फ ग्रहण दृष्टिकोण प्रदान करते हैं और आशा है कि यह NetBeans के साथ कुछ हद तक समान है कर सकते हैं:

  1. ट्राई/कैच बयान को दूर -> ग्रहण सही refactor करने के लिए संकलक त्रुटियों
  2. उपयोग ग्रहण के त्वरित टिप दिखाएगा कोशिश करें/पकड़ें (या फेंक दें) बयान

आप अपने मौजूदा अपवाद हैंडलिंग कोड को रीफैक्टरिंग के बाद पेस्ट करने के लिए सहेज सकते हैं।

संपादित

टॉम RuntimeException के बारे में एक बहुत अच्छा टिप्पणी की थी। तो प्रक्रिया बेहतर इस तरह दिखना चाहिए:

  1. प्रतिलिपि मौजूदा पकड़ खंड और एक नोटपैड/पाठ संपादक
  2. ट्राई/कैच बयान को दूर करने के पेस्ट -> ग्रहण संकलक त्रुटियों दिखाएगा
  3. उपयोग ग्रहण के त्वरित टिप सही ट्राई/कैच refactor करने के लिए (या फेंक) बयान
  4. पकड़ बयान के अनुक्रम के अंत में संग्रहीत पकड़ खंड पेस्ट

इस क्रम के अपने अपवाद हैंडलिंग सुरक्षित करेगा अपवाद (और उपप्रकार!)।

तो

try { 
    Integer.parseInt("Force a RuntimeException"); 
    myInputStream.close(); 
} catch (Exception oops) { 
    // catch both IOException and NumberFormatException 
} 

से आप

try { 
    Integer.parseInt("Force a RuntimeException"); 
    myInputStream.close(); 
} catch (IOException oops) { 
    // catch IOException 
} catch (Exception oops) { 
    // catch NumberFormatException 
} 

करने के लिए जाना है (हालांकि आप मैन्युअल रूप से इस मामले में NumberFormatException द्वारा अपवाद की जगह सकता है, लेकिन यह सिर्फ एक उदाहरण है)

+1

नोट, यह किसी भी 'रनटाइम अपवाद' के लिए काम नहीं करेगा। –

4

PMD की पहचान करता है इन सभी वे स्थान जहां आपके पास catch ब्लॉक खाली हैं (पीएमडी वास्तव में बहुत अधिक करता है)। इसमें नेटबीन एकीकरण है, इसलिए इसे आज़माएं।

खाली catch ब्लॉक के साथ सभी स्थानों की पहचान करने के बाद आप अपने आप में से हर एक पर विचार करना होगा:

  • कभी कभी बस संदेश लॉग इन करें
  • कभी कभी आस-पास के कोड पुनर्गठन। अर्थात। यदि आप NullPointerException को पकड़ रहे हैं, तो इसके बजाय null चेक जोड़ें।
  • कभी-कभी आपको पुनर्विचार (और चेकिंग घोषित) अपवादों पर विचार करना होगा।
संबंधित मुद्दे