एक अच्छी तरह से डिज़ाइन किए गए अपवाद ढांचे में, कुछ हद तक "अपेक्षित" और जो नहीं हैं अपवादों के बीच एक भेद किया जाना चाहिए। जावा इसके लिए अनचेक अपवादों के विरुद्ध चेक-इन का उपयोग करने का प्रयास करता है। उस मानक से, IOException एक अपवाद अपवाद होना चाहिए।
हालांकि, एक मौलिक समस्या यह है कि बार-बार कोड एक (शायद उचित) उम्मीद के साथ लिखा जाएगा कि एक निश्चित अपवाद नहीं होगा, और अगर ऐसा होता है तो इसे संभालने के लिए कुछ भी उपयोगी नहीं किया जा सकता है। यदि कोई विधि किसी विशेष चेक अपवाद को फेंकने के रूप में घोषित किया जाता है, तो जावा अपने कॉलर को अपवाद को अनदेखा करने की अनुमति देता है अगर वह स्वयं को उस अपवाद को फेंकने के रूप में घोषित करता है, लेकिन इसका कोई माध्यम नहीं है जिसके द्वारा कोई विधि या कोड ब्लॉक निर्दिष्ट कर सकता है कि विधियों नामक कुछ अपवाद हैं होने की उम्मीद नहीं है। एक आम विरोधी पैटर्न है:
try
{
methodThatsDeclaredAsThrowingFooExceptionButWont()
}
catch FooException Ex
{
// Never going to happen
}
स्पष्ट धारणा वहाँ catch
करने के लिए कोई कारण नहीं है के बाद से विधि FooException और एकमात्र कारण catch
वहाँ संकलक खुश करने के लिए है, फेंक नहीं होगा कि है कुछ भी। कपटी, क्योंकि अगर FooException
फेंक दिया जाता है, किसी भी कारण से, यह ज्ञात नहीं होगा।
एक वैकल्पिक एक तरीका है जिसके methodThatsDeclaredAsThrowingFooExceptionButWont throws FooException
या throws Exception
के रूप में घोषित करने के लिए कॉल के लिए है, लेकिन है कि या तो वास्तव में उचित नहीं है। यदि FooException
फेंकने की कोई विधि नहीं है, तो सिस्टम स्थिति FooException
फेंकने पर अपेक्षा की जा सकती है।
उदाहरण के लिए, मान लीजिए कि कोई दस्तावेज़ लोड करने का प्रयास करता है, लेकिन दस्तावेज़-लोड दिनचर्या को कुछ गैर-दस्तावेज़-विशिष्ट अनुवाद तालिकाओं को पढ़ने की आवश्यकता होती है जिन्हें एक निश्चित स्थान पर संग्रहीत किया जाना चाहिए; यदि वह प्रयास विफल रहता है, तो IOException
कॉलर तक पहुंचने से यह संकेत मिलेगा कि दस्तावेज़ लोड होने में कोई समस्या थी। यदि लोड-डॉक्यूमेंट रूटीन संभावित रूप से संभावना को संभालने के लिए तैयार नहीं है कि लोड-ट्रांसलेशन-टेबल दिनचर्या विफल हो सकती है, तो इस तरह की विफलता को उसी तरह से प्रतिबिंबित नहीं करना चाहिए जैसा कि वास्तव में दस्तावेज़ लोड करते समय IOException
होता है।
उचित उपाय IOException
के लिए एक अनचेक अपवाद होने के लिए नहीं होगा, बल्कि इसके बजाय एक घोषणात्मक माध्यम होने के लिए कौन सा कोड इंगित कर सकता है कि एक या अधिक प्रकार के चेक अपवादों को किसी निश्चित से बाहर निकलने की अनुमति नहीं दी जानी चाहिए इस प्रकार बुलाए गए तरीकों से ब्लॉक करें, लेकिन इसके बजाय किसी अन्य अपवाद प्रकार (जैसे रनटाइम अपवाद) में लपेटा जाना चाहिए।
कई लोगों को लगता है कि हर अपवाद अनियंत्रित किया जाना चाहिए था ... – leonbloy
बहुत से लोग जो अपवादों पर विचार करने की जरूरत है वे जानना चाहते हैं कि हो सकता है। –
@ Thorbjørn: मुझे संदेह है कि यह एक संयोग है कि किसी भी अन्य भाषा ने chekced अपवाद मॉडल की प्रतिलिपि बनाई है। यह एक दिलचस्प प्रयोग था, सिद्धांत में अच्छा लगता है, लेकिन अभ्यास में अच्छा से कहीं अधिक नुकसान करता है। –