इंटरफ़ेस का खुलासा करने के लिए अपवाद उचित होना चाहिए। आपके इंटरफ़ेस के कॉलर को कार्यान्वयन विवरणों को जानने या उससे निपटने की आवश्यकता नहीं है। जब तक NumberFormatException
exampleOneException
पर कॉल करते समय वास्तव में एक प्रकार की त्रुटि के रूप में समझ में आता है, तो इसका अनुवाद अधिक उपयुक्त अपवाद में किया जाना चाहिए।
एक और ठोस उदाहरण में आम तौर पर भिन्न कार्यान्वयन शामिल होते हैं, जहां इंटरफ़ेस के उपयोगकर्ताओं को कार्यान्वयन विनिर्देशों (जिसे संकलन समय पर भी ज्ञात नहीं किया जा सकता है) से निपटने के लिए आवश्यक नहीं होना चाहिए।
interface MyRepository {
Object read(int id) throws ObjectNotFoundException;
}
// a sql backed repository
class JdbcRepository implements MyRepository {
public Object read(int id) throws ObjectNotFoundException {
try { ... }
catch (SQLException ex) {
throw new ObjectNotFoundException(ex);
}
}
}
// a file backed repository
class FileRepository implements MyRepository {
public Object read(int id) throws ObjectNotFoundException {
try { ... }
catch (FileNotFoundException ex) {
throw new ObjectNotFoundException(ex)
}
}
}
क्योंकि इंटरफ़ेस त्रुटियों यह लौट सकते हैं के प्रकार वाणी, कि अंतरफलक के ग्राहकों सुसंगत और तर्कसंगत हो सकता है। FileNotFoundException
और SQLException
को संभालने के लिए कोड जोड़ना, तो वास्तविक कार्यान्वयन या तो हो सकता है, या न तो शानदार नहीं है।
विचार करें कि FileRepository
के कार्यान्वयन में कई जगहें हैं जो FileNotFoundException
फेंक सकती हैं। क्या इसका मतलब है कि उनमें से हर एक का तात्पर्य है ऑब्जेक्ट नहीं मिला?
विकल्प दो, exampleTwoException
पर विचार करते समय, यह जानना महत्वपूर्ण है कि आपका catch
ब्लॉक प्रभावी ढंग से बता रहा है कि जो भी त्रुटि हुई है, उसके प्रभाव कम हो गए हैं। वहाँ मामलों में जहां जांचे हुए अपवादों यथोचित ध्यान नहीं दिया जाता हैं, लेकिन यह है कि एक साधारण
try { ... }
catch (SomeException ex) {
log.error("caught some exception", ex);
}
वास्तव में अपवाद के परिणामों पर विचार नहीं एक डेवलपर का परिणाम है, या कोड एक को शामिल किया है चाहिए कहीं अधिक होने की संभावना है FIXME
।
यह और भी सत्य है जब आप catch (Exception ex)
देखते हैं, या unconscionable catch (Throwable ex)
।
और आखिरकार, क्या आप उन सभी स्थानों को खोजने के लिए एक व्यक्ति बनना चाहते हैं जहां आपको एक नया कार्यान्वयन संभालने के लिए एक और पकड़ ब्लॉक जोड़ने की आवश्यकता है? शायद कि catch (Exception ex)
का एक कारण है ...
हमेशा फेंक अपवाद अमूर्त
'उदाहरणऑनएक्सप्शन' कहने वाले तरीके 'MyBusinessException' को पकड़ सकते हैं और इसे अपनी आवश्यकताओं के अनुसार संभाल सकते हैं। 'ExampleTwoException' को कॉल करने के तरीके के बारे में जानने का कोई तरीका नहीं है कि कुछ भी गलत हो गया है। – khelwood
ये मौलिक रूप से अलग-अलग चीजें कर रहे हैं। आपके द्वारा उपयोग किए जाने वाले दृष्टिकोण पर निर्भर करता है कि आप त्रुटियों का जवाब कैसे देना चाहते हैं - उदा। बस उन्हें स्थानीय रूप से लॉग इन करना, उन्हें अग्रेषित करना, या समर्पित व्यावसायिक तर्क जो त्रुटि होने पर व्यवहार को बदलता है। –
वे दो कोड स्निपेट एक ही काम नहीं कर रहे हैं। एक में आप दूसरे में अपवाद को फिर से जोड़ रहे हैं, आप इसे लॉगिंग कर रहे हैं। –