दिलचस्प पोस्ट
PHP और एन्युमरेशन सी में वैरिएबल घोषणा प्लेसमेंट FindViewById () लेआउट XML में कस्टम घटक के लिए शून्य प्रदान करता है, अन्य घटकों के लिए नहीं मैं JSF FacesMessage को HTML कोड कैसे जोड़ूं? एंड्रॉइड छवि देखें पिंच ज़ूमिंग जब हम मैक्रो को परिभाषित करते हैं तो करते समय (0) का क्या उपयोग होता है? यदि ऑब्जेक्ट इंटरफ़ेस लागू होता है तो टेस्ट करें एक पायथन ट्यूपल के भीतर सूची का + = क्यों करता है TypeError बढ़ा देता है लेकिन सूची को वैसे भी संशोधित करता है? क्या 'eval' बुरा माना जाता है? Json.Net में PreserveReferencesHandling और ReferenceLoopHandling में क्या अंतर है? ReactJS दो घटक संचार Thread.sleep (x) का उपयोग करते समय मुझे अपवाद मिलता है या प्रतीक्षा करें () सी # त्रुटि: अभिभावक में कोई ऐसा कन्स्ट्रक्टर नहीं होता है, जो 0 तर्कों को लेता है क्यों इनलाइन ब्लॉक के साथ मार्जिन टॉप काम करता है लेकिन इनलाइन के साथ नहीं? PHP में समय अपलोड अपलोड कर सकता है?

जावा में, कब मुझे एक जाँच अपवाद बनाया जाना चाहिए, और यह एक रनटाइम अपवाद कब होना चाहिए?

संभव डुप्लिकेट:
जब चेक और अनचेक अपवाद चुनने के लिए

जब मुझे एक जाँच अपवाद बनाया जाना चाहिए, और मुझे एक रनटाइम अपवाद कब करना चाहिए?

उदाहरण के लिए, मान लीजिए कि मैं निम्न वर्ग बनाया है:

public class Account { private float balance; /* ... constructor, getter, and other fields and methods */ public void transferTo(Account other, float amount) { if (amount > balance) throw new NotEnoughBalanceException(); /* ... */ } } 

मुझे अपना NotEnoughBalanceException कैसे NotEnoughBalanceException ? क्या इसे Exception या RuntimeException विस्तार करना चाहिए? या क्या मैं इसके बजाय केवल IllegalArgumentException उपयोग करना चाहिए?

वेब के समाधान से एकत्रित समाधान "जावा में, कब मुझे एक जाँच अपवाद बनाया जाना चाहिए, और यह एक रनटाइम अपवाद कब होना चाहिए?"

इस विषय पर बहुत असहमति है। मेरे आखिरी काम पर, हम रनटाइम अपवादों के साथ कुछ वास्तविक मुद्दों पर चले गए, जब तक कि वे उत्पादन में प्रदर्शित न हो जाएं (agedwards.com पर), इसलिए हमने जांच की अपवादों को विशेष रूप से उपयोग करने का संकल्प लिया

मेरी वर्तमान नौकरी पर, मुझे लगता है कि ऐसे कई लोग हैं जो कई या सभी मामलों में रनटाइम अपवाद के लिए हैं।

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

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

मेरा अनुभव मुझसे कहता है कि मुझे उच्च गुणवत्ता मिलती है, वह यह है कि जो कोड काम करता है, जब मैं चेक अपवाद का उपयोग करता हूं चेक अपवाद क्लस्टर कोड हो सकता है, लेकिन इस से निपटने के लिए तकनीकें हैं। परत सीमा पार करते समय मुझे अपवादों का अनुवाद करना पसंद है उदाहरण के लिए, यदि मैं अपनी दृढ़ता परत से गुजर रहा हूं, तो मैं एक एसक्यूएल अपवाद को दृढ़ता अपवाद में परिवर्तित करना चाहूंगा, क्योंकि अगली परत को ध्यान नहीं देना चाहिए कि मैं एसक्यूएल डाटाबेस में बना रहा हूं, लेकिन मैं चाहता हूं कि पता है कि कुछ नहीं रह सकता है मैं एक और तकनीक का उपयोग कर रहा हूं जो अपवादों का एक सरल पदानुक्रम बनाना है। यह मुझे क्लीनर कोड एक परत लिखने देता है, क्योंकि मैं सुपरक्लास को पकड़ सकता हूं, और केवल व्यक्तिगत subclasses के साथ सौदा जब यह वास्तव में मायने रखता है।

सामान्य तौर पर, मुझे लगता है कि प्रभावी जावा में यहोशू ब्लाच द्वारा दी गई सलाह आपके प्रश्न का उत्तर सारांशित करती है: प्रोग्रामिंग त्रुटियों के लिए पुनर्प्राप्ति योग्य शर्तों और रनटाइम अपवादों (दूसरे संस्करण में आइटम 58) के लिए चेक किए गए एक्सपेंशन का उपयोग करें

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

लेकिन आइटम भी नोट करते हैं 59: अपवादों की अपरिहार्य उपयोग से बचें और 57: अपवादों को केवल असाधारण स्थितियों के लिए उपयोग करें जैसा कि अन्य लोगों ने बताया है, यह मामला एक अपवाद को बिल्कुल भी नहीं दे सकता है। यदि पर्याप्त क्रेडिट नहीं है तो false (या शायद क्या हुआ के विवरण के साथ एक स्थिति ऑब्जेक्ट लौटाएं)

चेक अपवादों का उपयोग कब किया जाए? ईमानदारी से? मेरी विनम्र राय में … कभी नहीं मुझे लगता है कि यह पिछले 6 वर्षों से रहा है जब मैंने पिछली बार एक जाँच अपवाद बनाया था।

आप किसी को किसी त्रुटि से निपटने के लिए मजबूर नहीं कर सकते बेशक यह कोड बेहतर नहीं बदतर बनाता है मैं आपको इस तरह से कोड भरने की संख्या की संख्या नहीं बता सकता हूं:

 try { ... } catch (IOException e) { // do nothing } 

जबकि मेरे पास अनगिनत बार लिखे कोड हैं I

 try { ... } catch (IOException e) { throw new RuntimeExceptione(e); } 

क्यूं कर? क्योंकि एक शर्त (जरूरी नहीं कि IOException, यह सिर्फ एक उदाहरण है) वसूली योग्य नहीं थी, लेकिन वैसे भी मेरे गले को मजबूर कर दिया गया था और मुझे ऊपर से और प्रदूषित API के बीच चुनाव करने के लिए मजबूर किया जाता है, सिर्फ एक जाँच अपवाद सभी तरह का प्रचार करने के लिए शीर्ष पर जहां यह (सही तरीके से) घातक है और लॉग इन होगा

एक कारण है कि वसंत के डीएओ सहायक वर्गों ने चेक किए गए SQLException को अनियंत्रित डेटाएवेशएक्सेप्शन में अनुवाद किया है।

यदि आपके पास डिस्क पर लिखित अनुमतियों की कमी है, डिस्क स्थान या अन्य घातक स्थितियों की कमी है, तो आप जितना संभव हो सके उतना शोर बनाना चाहते हैं और ऐसा करने का तरीका अनचेक अपवाद (या यहां तक ​​कि त्रुटियों) भी है।

इसके अतिरिक्त, जांचने वाले अपवादों को तोड़ने में

यह विचार है कि "वसूली योग्य" त्रुटियों के लिए जांच की गई अपवादों का उपयोग वास्तव में पाई-इन-द-आसमान इच्छाधारी सोच के लिए किया जाना चाहिए

जावा में चेक किए गए अपवाद एक प्रयोग थे … एक असफल प्रयोग हमें अपने घाटे में कटौती करना चाहिए, स्वीकार करें कि हम एक गलती की और आगे बढ़ें। आईएमएचओ। ने इसे अनियंत्रित अपवादों के द्वारा ठीक ही मिला। फिर फिर से जावा की गलतियों से सीखने का दूसरा अपवादक लाभ था।

आईएमएचओ, यह बिल्कुल अपवाद नहीं होना चाहिए। एक अपवाद, मेरे दिमाग में, जब असाधारण बातें होती हैं, और प्रवाह नियंत्रण के रूप में नहीं होनी चाहिए।

आपके मामले में, यह किसी असाधारण स्थिति में नहीं है जो कि शेष राशि की तुलना में अधिक धनराशि हस्तांतरित करने की कोशिश करता है। मैं समझता हूं कि ये चीजें वास्तविक दुनिया में अक्सर होती हैं। तो आपको इन स्थितियों के खिलाफ कार्यक्रम करना चाहिए एक अपवाद यह हो सकता है कि आपका स्टेटमेंट अच्छा संतुलन का मूल्यांकन करता है, लेकिन जब खाते को वास्तव में खाते से घटाया जाता है, तो शेष कुछ अच्छा नहीं है, कुछ अजीब कारण के लिए।

एक अपवाद हो सकता है कि, transferTo() पहले ही transferTo() , आपने चेक किया कि रेखा बैंक के लिए खुली थी। लेकिन transferTo() अंदर transferTo() , कोड नोटिस है कि लाइन को और भी नहीं खुलता है, हालांकि, सभी तर्कों से, यह होना चाहिए। यह एक अपवाद है। यदि लाइन को नहीं खोला जा सकता है, तो यह एक अपवाद नहीं है, यह एक व्यवहार्य स्थिति है।

IMHO रीकैप: अपवाद == अजीब काली जादू

किया जा रहा है-रचनात्मक संपादित:

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

उस स्थिति में, आपके पास एक पंक्ति में आपके सभी बतख होते हैं, और जानते हैं कि आप कुछ भी नहीं कर सकते (क्योंकि जो true था वह false हो गया था, जैसे कि स्वयं), अपवाद को लॉग इन करने के अलावा, किसी को अधिसूचना भेजें, और बताएं ग्राहक ने नम्रतापूर्वक कहा कि किसी ने अपनी अंतिम महिमा के दौरान अपनी कुंवारी को ठीक से नहीं बलिदान किया, और समस्या पहले संभव समय पर तय की जाएगी।

कम-enterprisey-सुझाव संपादित:

यदि आप यह अपनी खुद की खुशी के लिए कर रहे हैं (और मामला ऐसा लगता है, टिप्पणियां देखें), मैं बजाय एक बूलीयन लौटने का सुझाव दिया था उपयोग कुछ ऐसा होगा:

 // ... boolean success = transferTo(otherAccount, ONE_MILLION_DOLLARS_EXCLAMATION); if (!success) { UI.showMessage("Aww shucks. You're not that rich"); return; // or something... } else { profit(); } // ... 

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

मेरा नियम है

  • यदि व्यापार तर्क त्रुटियों के लिए बयान (जैसे आपके कोड)
  • पर्यावरण त्रुटियों के लिए चीवर्ड अपवाद जहां आवेदन ठीक हो सकता है
  • पर्यावरण की त्रुटियों के लिए अपवाद हटाया गया है जहां कोई रिकवरी नहीं है

    1. जाँच की गई अपवाद का उदाहरण: नेटवर्क एक ऐसे एप्लिकेशन के लिए नीचे है, जो ऑफ़लाइन काम कर सकता है
    2. अनचाहे अपवाद के लिए उदाहरण: डेटाबेस CRUD वेब अनुप्रयोग पर नीचे है।

इस विषय पर बहुत दस्तावेज हैं हायबरनेट वेब पृष्ठों को ब्राउज़ करके आप बहुत कुछ पा सकते हैं क्योंकि उन्होंने हाइबरनेट 2.x के सभी अपवादों को संस्करण 3.x में अनचेक किए गए चेक को बदल दिया है

अनचाहे अपवादों से – विवाद :

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

ध्यान दें कि एक अनचेक अपवाद RuntimeException से लिया गया है और एक अपवाद अपवाद से लिया गया है

अगर एक क्लाइंट अपवाद से पुनर्प्राप्त करने के लिए कुछ भी नहीं कर सकता, तो RuntimeException क्यों फेंकें? लेख बताता है:

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

मेरी भावना यह है कि जांच की गई अपवाद एक उपयोगी अनुबंध है जिसे कम से कम इस्तेमाल किया जाना चाहिए क्लासिक उदाहरण जहां मुझे लगता है कि एक जाँच अपवाद एक अच्छा विचार है, एक बाधित है Exception मेरी भावना यह है कि जब मैं इसे रोकना चाहता हूं, तब तक मुझे किसी थ्रेड / प्रोसेस को रोकने में सक्षम होना चाहिए, भले ही किसी को Thread.sleep () में कितना समय निर्दिष्ट किया गया हो।

तो, अपने विशिष्ट प्रश्न का उत्तर देने की कोशिश करना, क्या ऐसा कुछ है जो आप सुनिश्चित करना चाहते हैं कि हर किसी के साथ काम करता है? मेरे दिमाग में, ऐसी स्थिति में जहां Account में पर्याप्त धन नहीं होता है, वह एक गंभीर समस्या है जिसे आपको इसके साथ सौदा करना होगा।

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

 catch (InterruptedException ie) { Thread.currentThread().interrupt(); } 

यह हैंडलर यह सुनिश्चित करेगा कि कोड को चेक अपवाद कैच किया गया और ठीक वही किया जो आप चाहते हैं: इस थ्रेड को रोकने के लिए। बेशक, अगर कोई अन्य अपवाद हैंडलर / खानेवाला अपस्ट्रीम है, तो यह असंभव नहीं है कि यह अपवाद को कम अच्छी तरह से संभाल देगा फिर भी, FindBugs आप उन को खोजने में मदद कर सकते हैं

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

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

एक जाँच अपवाद का अर्थ है कि क्लास के क्लाइंट को संकलक द्वारा इसके साथ सौदा करने के लिए मजबूर किया जाता है। उनका कोड संकलित नहीं कर सकता जब तक कि वे एक प्रयास / पकड़ ब्लॉक जोड़ते हैं।

सी # के डिजाइनर ने निर्णय लिया है कि अनियंत्रित अपवाद पसंदीदा हैं।

या आप सी-स्टाइल का पालन कर सकते हैं और वापसी मान की जांच कर सकते हैं और अपवाद नहीं फेंक सकते हैं।

अपवादों की लागत होती है, इसलिए उनका नियंत्रण प्रवाह के लिए उपयोग नहीं किया जाना चाहिए, जैसा कि पहले उल्लेख किया गया है। लेकिन एक चीज जो उनके लिए जा रही है वह यह है कि उन्हें नजरअंदाज नहीं किया जा सकता है।

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

मैं एक अनियंत्रित अपवाद की अनुशंसा करता था, और मैं इसे एक वर्णनात्मक नाम देना चाहता था जैसे कि अपर्याप्तफ़ंड्स अपवाद यह स्पष्ट करने के लिए कि क्या चल रहा था।

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

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

यह एक ज्ञात समस्या है जो जावा में अपवादों की अधिक जांच की जाती है, लेकिन इसका यह मतलब नहीं है कि वे सभी बुरे हैं। यही कारण है कि यह वसंत दर्शन का अभिन्न अंग है, उदाहरण के लिए ( http://www.springsource.org/about )

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

ब्रूस एकलेल, जो लेखक सोच में जावा में है , इस विषय पर एक अच्छा निबंध है ।

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

IllegalArgumentException RuntimeException IllegalArgumentException का उपवर्ग है, जो इसे अनचाहे अपवाद बनाता है मैं केवल इसे फेंकने पर विचार करता हूं अगर कॉलर के पास यह तय करने का कोई आसान तरीका है कि विधि तर्क कानूनी हैं या नहीं। आपके विशेष कोड में, यह स्पष्ट नहीं है कि अगर कॉलर को balance तक पहुंच है, या पूरे "चेक बैलेंस और ट्रांसफर फ़ंड" एक परमाणु आपरेशन है (यदि ऐसा नहीं है तो कॉलर वास्तव में तर्कों को मान्य करने का कोई सुविधाजनक तरीका नहीं है) ।

संपादित करें: अवैध IllegalArgumentException को फेंकने पर मेरी स्थिति स्पष्ट किया।

स्वयं, मैं चेक अपवादों का उपयोग करना पसंद करता हूं जैसा कि मैं कर सकता हूं।

यदि आप एक एपीआई डेवलपर हैं (बैक-एंड डेवलपर), चेक अपवाद का उपयोग करें, अन्यथा, रनटाइम अपवाद का उपयोग करें।

यह भी ध्यान रखें कि, कुछ परिस्थितियों में रनटाइम अपवादों का उपयोग करना एक बड़ी गलती है, उदाहरण के लिए यदि आप अपने सत्र बीन्स से रनटाइम अपवाद फेंक देते हैं (देखें: http://m-hewedy.blogspot.com/2010/01/ सेशन फेंकने- रनटाइम एक्सप्शन- से -9) सत्र बीन्स में रनटाइम एक्सप्रेशन के इस्तेमाल से समस्या के बारे में अधिक जानकारी के लिए)