2010-09-19 19 views
22

उसकी प्रभावी जावा में यहोशू बलोच लिखते हैं:आप अनचेक अपवाद कैसे दस्तावेज़ करते हैं?

"प्रत्येक अनियंत्रित अपवाद है कि एक विधि फेंक कर सकते हैं दस्तावेज़ के लिए जावाडोक @throws टैग का प्रयोग करें, लेकिन कीवर्ड फेंकता विधि घोषणा में अनियंत्रित अपवाद शामिल करने के लिए उपयोग नहीं करते हैं । "

खैर कि वास्तव में उचित लगता है, लेकिन कैसे पता लगाने के लिए, क्या अनियंत्रित अपवाद मेरी विधि फेंक कर सकते हैं?

के एक के बाद वर्ग की सोचते हैं:

public class FooClass { 

    private MyClass[] myClass; 

    /** 
    * Creates new FooClass 
    */ 
    public FooClass() { 
     // code omitted 
     // do something with myClass 
    } 

    /** 
    * Performs foo operation.<br /> 
    * Whatever is calculated. 
    * @param index Index of a desired element 
    * @throws HorribleException When something horrible happens during computation 
    */ 
    public void foo(int index) { 
     try { 
      myClass[index].doComputation(); 
     } catch (MyComputationException e) { 
      System.out.println("Something horrible happened during computation"); 
      throw new HorribleException(e); 
     } 
    } 
} 

अब, मैं HorribleException दस्तावेज है, लेकिन यह काफी स्पष्ट है, कि foo विधि भी अनियंत्रित java.lang.ArrayIndexOutOfBoundsException फेंक कर सकते हैं। कोड जितना जटिल होगा, सभी अनचेक अपवादों के बारे में सोचना मुश्किल है कि विधि फेंक सकती है। मेरा आईडीई मुझे बहुत मदद नहीं करता है और न ही कोई उपकरण करता है। चूंकि मुझे इसके लिए कोई उपकरण नहीं पता है ...

आप इस तरह की स्थिति से कैसे निपटते हैं?

+3

मुझे लगता है कि मार्ग का अर्थ क्या है कि आप सभी अनचेक अपवाद दस्तावेज करते हैं आपका कोड स्पष्ट रूप से फेंकता है - जिस विधि को आप दस्तावेज कर रहे हैं और यदि यह आपके किसी भी अन्य तरीके को कॉल करता है जो अनचेक अपवाद फेंकता है। –

+0

इसके बजाय 'नया भयानक अपवाद फेंक दें ("अनुक्रमणिका =" + अनुक्रमणिका, ई) '। आपके स्टैक में जितनी अधिक जानकारी आपके पास है, उतनी ही बेहतर है। –

+0

यह सिर्फ डमी उदाहरण है। मेरा मानना ​​है कि असली बिंदु एक और था - भयानक अपवाद पर विचार किया गया, लेकिन ArrayIndexOutOfBoundsException नहीं। विभिन्न अपवादों पर विचार करें, न केवल डमी फू विधि। – Xorty

उत्तर

14

केवल वही जो आप स्पष्ट रूप से अपने आप को मना रहे हैं या किसी अन्य विधि से के माध्यम से गुजर रहे हैं दस्तावेज़। शेष अवशेषों को बग के रूप में माना जाना है जिन्हें अच्छी इकाई परीक्षण और ठोस कोड लिखना है।

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

+1

मुझे नहीं पता कि सूचकांक की जांच क्यों की जानी चाहिए। आखिरकार, 'ArrayIndexOutOfBoundsException' स्पष्ट और समझदार पर्याप्त है। यदि आप मैन्युअल रूप से इंडेक्स की जांच करते हैं, तो आप किसी भी तरह से 'ArrayIndexOutofBoundsException' फेंकने की संभावना रखते हैं, इसलिए मुझे इसे मैन्युअल रूप से करने में बिंदु दिखाई नहीं देता है। हालांकि, मुझे लगता है कि यह दस्तावेज के लायक है। –

+6

@ विवियन: मैं इसे 'नया IllegalArgumentException ("अज्ञात अनुक्रमणिका") के रूप में पुनर्स्थापित कर दूंगा क्योंकि यह कॉलर के लिए स्पष्ट नहीं है कि एक सरणी "हुड के नीचे" उपयोग की जाती है। – BalusC

+3

@ विवियन: 'ArrayIndexOutOfBoundsException' पूरी तरह से उचित है ... यदि आप किसी सरणी से निपट रहे हैं। 'Foo' का कॉलर नहीं है; यह 'foo' से निपट रहा है। तथ्य यह है कि 'foo' कवर के तहत एक सरणी का उपयोग करता है एक कार्यान्वयन विस्तार है। तो मैं कहूंगा कि अगर 'foo' अपवाद फेंकने जा रहा है, तो उसे' अवैध अवैधकरण 'जैसे कुछ और उचित फेंक देना चाहिए। लेकिन यह केवल तभी होता है जब यह * फू 'के लिए वास्तव में उपयुक्त है ताकि इस मामले में * सभी * में अपवाद फेंक दिया जा सके। अपवाद * असाधारण * स्थितियों के लिए हैं। 'Foo' के बारे में और जानने के बिना, हम यह नहीं बता सकते कि अमान्य तर्क वास्तव में असाधारण है या नहीं। –

-1

आपके द्वारा पोस्ट किया गया उद्धरण, यदि आप आदर्श प्रोग्रामर बनना चाहते हैं तो आपको केवल कुछ ध्यान रखना होगा। प्रोग्रामिंग यह नहीं सोच रहा है कि "क्या गलत हो सकता है", लेकिन ऐसा लगता है कि कुछ बेहतरीन तरीका कैसे करें और इसे कैसे करें। यदि यह एक निजी परियोजना है, तो बस लिखें कि विधि क्या करती है।

  • विधि दस्तावेज़ नहीं है:

    हालांकि, वहाँ तीन संभावित हल हैं।

  • अपने कोड के एक मिनट के बारे में सोचें और पता लगाएं कि सबसे आम संभव अनचेक अपवाद क्या हो सकता है। उन्हें जावा-डॉक में जोड़ें। और यदि आप एक नए से मुठभेड़ करते हैं, तो पता लगाएं कि समस्या क्या है और इसे संभावित अपवाद के रूप में जोड़ें।
  • संभव अपवाद और दस्तावेज़ के बारे में परवाह नहीं है केवल अपवाद आप विधि शरीर में फेंक (जैसे: if (obj == null) { throw new NullPointerException(); })।
0

हमारे पास हमारे टेस्ट सर्वर पर चलने वाला एक लिखित चेकस्टाइल एक्सटेंशन है। आपके नमूने में यह परीक्षण करेगा कि भयानक अपवाद को दस्तावेज किया गया था या नहीं।

ArrayIndexOutOfBoundsException कोड समीक्षा के साथ पता लगाएगा। आपके नमूना कोड में हमारे लक्ष्यों को एक ArrayIndexOutOfBoundsException के बजाय एक अवैधArgumentException फेंकने की आवश्यकता है। इसका दस्तावेज परीक्षण सर्वर से मिलेगा।

ArrayIndexOutOfBoundsException FindBugs में एक चेतावनी हो सकती है। किंतु मुझे यकीन नहीं है।

1

केवल वही दस्तावेज जो आप स्वयं फेंक रहे हैं।

इस मामले में, मैं एक सूचकांक सीमा के लिए जाना चाहते हैं की जाँच करें और अपने खुद के अपवाद: throw IllegalArgumentException("Index must be smaller than " +myClass.length + ", but is: " + index) और फिर JavaDoc में दस्तावेज़ IllegalArgumentException

+0

ज़रूर लेकिन यह बात है। सभी संभावित अपवादों के बारे में सोचना मुश्किल है - इस तरह। अब यह काफी स्पष्ट है, लेकिन आप 500 कई तरह लाइनों के तरीकों की परियोजना है और आप "फेंक" नहीं है जब - मतलब है कि आप फेंक clausule ... – Xorty

+0

@Xorty उपयोग नहीं कर रहे: आप कई 500 लाइन तरीकों है, और अगर हैं आपको यह "सभी संभावित अपवादों के बारे में सोचना मुश्किल लगता है", ये निश्चित संकेत हैं कि आपकी विधियां बहुत जटिल हो सकती हैं, और आपको शायद थोड़ा सा रिफैक्टरिंग करने की आवश्यकता है। Http://c2.com/cgi/wiki?TallerThanMe, और http://c2.com/cgi/wiki?LongMethodSmell देखें। – Grodriguez

+0

@ ग्रोड्रिगेज मैं चाहता हूं कि दुनिया अधिक परीक्षण करने वाले लोगों के साथ अधिक भयानक जगह हो, जो इकाई परीक्षण और दस्तावेज़ीकरण पसंद करते हैं ... लेकिन आम तौर पर आपको पहले से ही प्रोजेक्ट में कुछ मॉड्यूल लागू करने की आवश्यकता होती है और यह दर्द – Xorty

2

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

आप एक समस्या कहाँ देखते हैं, मैं एक बहुत अच्छा अपने उदाहरण में सरल अपने कोड रखने के लिए ;-)

कारण देखते हैं, मैं ArrayIndexOutOfBoundsException दस्तावेज़ के लिए सुझाव देना चाहेंगे। सिर्फ इसलिए कि किसी व्यक्ति के पास आपके लिए खराब पैरामीटर देने पर कुछ हो सकता है, और इसे कहीं लिखा जाना चाहिए: "यदि आपने एक अवैध सरणी अनुक्रमणिका दी है, तो आपको ArrayIndexOutOfBoundsException मिलेगा। उदाहरण के लिए, String#charAt() विधि दस्तावेज़ यह फेंक सकता है IndexOutOfBoundException यदि सूचकांक मान्य नहीं है।

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

+1

है क्या आपने 'charAt() के स्रोत की जांच की है '? यह सीमा की जांच करता है और इसे ** स्पष्ट रूप से ** 'स्ट्रिंग इंडेक्सऑटऑफबाउंड एक्सेप्शन' के रूप में फेंकता है। यदि आप ओपी के मामले में एक ही दृष्टिकोण का पालन करेंगे, तो आप 'FooIndexOutOfBoundsException' फेंक देंगे। – BalusC

+0

@ बालससी: ठीक है, यह शायद वहां का सबसे अच्छा उदाहरण नहीं हो सकता है। अपने उत्तर पर टिप्पणियां देखें। –

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