जावा में अपवादों पर प्रत्यय अपवाद


19

अपवाद वर्गों पर अपवाद का एक प्रत्यय निर्दिष्ट करना मेरे लिए एक कोड गंध की तरह लगता है (अनावश्यक जानकारी - शेष नाम एक त्रुटि स्थिति का अर्थ है और यह अपवाद से विरासत में मिला है)। हालाँकि, ऐसा भी लगता है कि हर कोई ऐसा करता है और यह अच्छा अभ्यास है।

मैं यह समझना चाह रहा हूं कि यह अच्छा अभ्यास क्यों है।

मैंने इस प्रश्न को पहले ही देखा और पढ़ा है कि अपवादों का वर्ग नाम में आमतौर पर प्रत्यय क्यों होता है

सवाल PHP के लिए है और जबकि प्रतिक्रियाएं संभवतः जावा के लिए मान्य हैं। क्या कोई अन्य तर्क हैं या क्या यह वास्तव में उतना ही सरल है जितना स्पष्ट रूप से उन्हें अलग करना?

यदि हम पिछले प्रश्न से उदाहरण लेते हैं - क्या वास्तव में जावा में ऐसे नाम के साथ कक्षाएं हो सकती हैं FileNoFoundजो अपवाद नहीं हैं? अगर वहाँ हो सकता है, क्या यह इसके साथ प्रत्यय देता है Exception?

ग्रहण के त्वरित पदानुक्रम को देखते हुए Exception, निश्चित रूप से पर्याप्त है, उनमें से अधिकांश के पास अपवाद का प्रत्यय है, लेकिन कुछ अपवाद हैं। javassistएक पुस्तकालय का एक उदाहरण है जो लगता है कि प्रत्यय के बिना कुछ अपवाद हैं - जैसे BadByteCode, BadHttpRequestआदि।

BouncyCastle अपवादों के साथ एक और परिवाद है CompileError

मैं इस विषय पर बहुत कम जानकारी के साथ थोड़ा सा घूम चुका हूं।


2
"क्या सभी अपवादों में एक Exceptionप्रत्यय होना चाहिए, या क्या हमें असाधारण अपवादों के लिए अपवाद बनाना चाहिए?" ;)
तदमर्स

2
वास्तव में त्रुटि अपवाद की तरह है (OutOfMemoryError देखें), लेकिन वे उन चीजों के लिए हैं, जिनसे उबरना मुश्किल है (इसलिए आप उनके साथ लगभग कभी भी व्यवहार नहीं करते हैं)
शाफ़्ट फ्रीक

1
इसके अलावा, मैंने सुना है कि एक सामान्य नियम के रूप में 'कक्षाएं संज्ञाएं होनी चाहिए और विधियां क्रिया (क्रियाएं) होनी चाहिए'। FileNotFound ArrayIndexOutOfBoundsऔर OutOfMemoryअधिक अवलोकन / विवरण हैं, लेकिन फिर संज्ञा पर लागू होते हैं Exception
माइकइलियार

जवाबों:


27

लांडे का उत्तर एक अच्छा है, लेकिन व्याकरणिक उत्तर भी है। वर्ग के नाम संज्ञाएं होनी चाहिए । एक "आउटऑफमेरी" क्या है? एक "FileNotFound" क्या है? यदि आप संज्ञा के रूप में "अपवाद" के बारे में सोचते हैं, तो विवरणक विशेषण है जो इसे निर्दिष्ट करता है। यह सिर्फ कोई नहीं है Exception, यह एक है FileNotFoundException। आपको OutOfMemory"ब्लू" खरीदने के लिए स्टोर पर जाने से अधिक किसी को पकड़ने की आवश्यकता नहीं होनी चाहिए ।

यह भी पता चलता है कि क्या आप अपने कोड को एक वाक्य के रूप में पढ़ते हैं: " Tryकर ..., और catch OutOfMemory Exceptions"


1
लेख को उद्धृत करने के लिए "संज्ञाओं का उपयोग करने का प्रयास करें क्योंकि एक वर्ग सामान्य रूप से वास्तविक दुनिया में कुछ का प्रतिनिधित्व कर रहा है"। लेकिन क्या अपवाद इस मामले में आते हैं? मेरे लिए, वे एक त्रुटि संदेश का प्रतिनिधित्व करते हुए प्रोग्रामिंग आर्टिफैक्ट की तरह हैं। "आपको एक OutOfMemoryअपवाद मिलेगा " बेहतर है "आपको एक OutOfMemoryExceptionअपवाद मिलेगा ", है ना?
greg0ire

1
@ greg0ire - आपको इसे "आपको मिल जाएगा ए" के रूप में आज़माना चाहिए OutOfMemoryException। जैसा कि कहा गया, हम भी, पिन नंबर और एटीएम मशीन है, तो एक OOME अपवाद नहीं होगा कि असामान्य।
बोबसन

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

किया हुआ! तुम क्या सोचते हो?
greg0ire

@ बोबसन मैं द किंगडम ऑफ नून्स पढ़ने की सलाह देता हूं । हमें संज्ञा बनने के लिए हर चीज की जरूरत नहीं है। क्यों "आपको एक OutOfMemoryException" मिलेगा जब यह बस "आप स्मृति से बाहर हैं " हो सकता है ? हम प्रयोग नहीं करते Classप्रत्यय ( DogClass, CatClass, XmlReaderClass, ...)।
मैथ्यू नेपोली

6

मुझे लगता है कि अपवाद (और त्रुटियों, और सैद्धांतिक रूप से अन्य Throwableएस) इंटरफेस या एनम (जो आमतौर पर प्रत्यय के रूप में उपयोग नहीं किए जाते हैं) जैसी चीजों से अलग होते हैं: उनके पास आमतौर पर एक बहुत स्पष्ट और सीमित उद्देश्य होता है, उनका उपयोग विशेष भाषा निर्माणों के साथ किया जाता है ( try, catch, throw, throws) और विशेष नियमों का पालन करें (जैसे, अनियंत्रित अपवाद बनाम जाँच की कोई जेनरिक)। एक तरह से वे केवल ऐसी कक्षाएं नहीं हैं जो अपवाद के रूप में उपयोग की जाती हैं, लेकिन एक अपवाद तंत्र है जो कक्षाओं के माध्यम से कार्यान्वित किया जाता है।

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


1
मुझे आत्मविरोधी लगता है। यदि अपवाद हैं कि विशेष और विशेष तरीकों से उपयोग किए जाते हैं और इसलिए स्पष्ट रूप से पहचाने जाने योग्य हैं, तो आपको दृश्य सुराग की आवश्यकता क्यों है?
माइकल बोर्गवर्ड

@MichaelBorgwardt - मुझे लगता है कि वह कह रहा है कि क्योंकि वे विशेष हैं और विशेष तरीकों से उपयोग किए जाते हैं, इसलिए उन्हें स्पष्ट रूप से पहचान योग्य होने के लिए दृश्य सुराग होना चाहिए। यह कहा जा रहा है, मुझे नहीं पता कि क्या आप कुछ ऐसा भी फेंक सकते हैं जो Exceptionजावा से विरासत में नहीं मिला है - आप सी # में नहीं कर सकते। यदि आप नहीं कर सकते हैं, तो मैं ऐसे परिदृश्य के बारे में नहीं सोच सकता, जहां आप "अपवाद के साथ काम कर रहे हैं और इसे इस तरह से नहीं पहचानते हैं"।
बोबसन

आप Throwableजावा में गैर- एस नहीं फेंक सकते हैं , या तो। लेकिन अगर आप अपवाद के साथ सौदा कर सकते हैं न केवल में try- catch-settings, जैसे जब आप जटिल वस्तुओं के लिए सत्यापन के कुछ प्रकार बनाने आप अपवाद को इकट्ठा कर सकते हैं (जब आप जानना चाहते हैं सभी संबंधित समस्याओं, न केवल पहले एक)। ऐसे मामलों में आपको पता होना चाहिए कि आप अपनी सूची में मौजूद चीजों को फिर से फेंक सकते हैं, इसलिए उन्हें कॉल करना या ValidationIssueइसके बजाय बुरा होगा ValidationException
लैंडेई

0

हालाँकि, ऐसा भी लगता है कि हर कोई ऐसा करता है और यह अच्छा अभ्यास है।

हां, हर कोई वास्तव में ऐसा करता है, इसलिए यह एक अभ्यास है, लेकिन क्या यह अभी भी अच्छा है? कई लोग सवाल कर रहे हैं कि:

  • http://mnapoli.fr/approaching-coding-style-rationally/ (अपवाद प्रत्यय) संदर्भ: php)
  • लिंक किए गए वीडियो, https://vimeo.com/album/2661665/video/74316116 (53:00 पर जाएं, संदर्भ: php), लेख को प्रेरित करता है और यह बताता है कि हर बार जब आप अपवाद का उपयोग करते हैं, तो आपके पास एक कीवर्ड होता है यह पहले से ही दिखाता है कि यह पास में एक अपवाद है
  • http://verraes.net/2013/10/verbs-in-class-names/ दिखाता है कि @Bobson के उत्तर में बयान कैसे निरपेक्ष नहीं हो सकता है, और कभी-कभी प्रत्यय अच्छा होता है, या आवेदन के लिए बुनियादी ढांचे के स्तर के अपवाद, और कभी-कभी आपको कुछ अधिक सटीक और सार्थक व्यक्त करने के लिए इस लंबे प्रत्यय द्वारा लिए गए पात्रों को बचाने की कोशिश करनी चाहिए। यह बिंदु केवल तभी समझ में आता है जब आप ऐसी भाषा का उपयोग करते हैं जहां संस्कृति को व्यावसायिक नियमों के उल्लंघन के अपवादों का उपयोग करना है।
  • आपके द्वारा प्रदान किया गया SO लिंक नाम के टकराव के बारे में बिंदु बनाता है, लेकिन अब, हमारे पास नाम स्थान हैं, क्या हम नहीं?

यह एक जावा प्रश्न है, न कि एक php । भाषाओं के बीच मुहावरे अलग होते हैं। उस ने कहा, मैं आपके तीसरे लिंक से इस उद्धरण से दृढ़ता से असहमत हूं : "अपवाद घटनाओं के समान हो सकते हैं, ... इस अति सूक्ष्म घटना के साथ कि यह एक अवांछनीय घटना है, एक चेतावनी है कि कुछ ऑपरेशन के साथ असंगत था, उदाहरण के लिए, व्यापार नियम प्रभाव में हैं। " शायद PHP इस बारे में अलग है, लेकिन मेरे दिमाग में, अपवाद असाधारण माना जाता है। यदि किसी व्यावसायिक नियम का किसी भी अपेक्षित तरीके से उल्लंघन किया जाता है, तो आपके सामान्य तर्क को इसे संभालना चाहिए - यह सामान्य व्यवहार का अपवाद नहीं है।
बोबसन

आप इसमें सही हो सकते हैं कि यह भाषा-प्रति-भाषा के आधार पर भिन्न होता है: अजगर के बारे में यह धागा देखें: gossamer-threads.com/lists/python/python/796627 । php और python स्पष्ट रूप से प्रदर्शन-केंद्रित नहीं हैं, शायद इसीलिए java (जो प्रदर्शन-केंद्रित, सही है?) के साथ यह अंतर है। यदि आपके पास व्यापार नियम के उल्लंघन को सही तरीके से संभालने के लिए सही स्तर पर होने से पहले आपके कॉल स्टैक को पार करने के लिए कई परतें हैं, तो अपवाद सबसे अच्छा आईएमओ हैं। यह रिटर्न प्रकारों को और अधिक सुसंगत बनाता है (आप हमेशा एक ही प्रकार का रिटर्न देते हैं, न कि गलत या सत्य)। मैं अपने जवाब को खाते में संपादित करूँगा
greg0ire
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.