पाठ 32 / 38
कस्टम एक्सेप्शन व मल्टी-कैच
अपने खुद के एक्सेप्शन टाइप डिज़ाइन करें जो सार्थक संदर्भ रखें, और एक संक्षिप्त catch क्लॉज़ में कई एक्सेप्शन टाइप संभालें।
एक कस्टम checked एक्सेप्शन
callers को संभालना ही होगा ऐसे checked एक्सेप्शन के लिए Exception एक्सटेंड करें, या प्रोग्रामिंग त्रुटि दर्शाने वाले unchecked के लिए RuntimeException। मूल कारण को हमेशा chain करें ताकि stack trace पूरा रहे।
public class InsufficientFundsException extends Exception {
private final double shortfall;
public InsufficientFundsException(double shortfall) {
super("short by " + shortfall);
this.shortfall = shortfall;
}
public double getShortfall() { return shortfall; }
}
// caller:
void withdraw(double amt) throws InsufficientFundsException {
if (amt > balance) throw new InsufficientFundsException(amt - balance);
balance -= amt;
}मल्टी-कैच
जब दो एक्सेप्शन टाइप को एक जैसी हैंडलिंग चाहिए, ब्लॉक दोहराने की बजाय | से दोनों catch करें। कैच किया वेरिएबल प्रभावी रूप से final और साझा सुपरटाइप का होता है।
try {
process(file);
} catch (IOException | ParseException e) {
log.error("could not process file", e);
throw new RuntimeException(e);
}संदर्भ के साथ दोबारा फेंकें, छुपाएँ नहीं
निम्न-स्तर के एक्सेप्शन को पकड़कर अधिक सार्थक एक्सेप्शन फेंकना अच्छी प्रथा है — बशर्ते मूल को कारण के रूप में आगे भेजें (new ServiceException("...", e)), कभी न छोड़ें, वरना असली मूल कारण प्रोडक्शन लॉग में अदृश्य हो जाता है।
त्वरित जाँच
त्वरित जाँच: अगर callers को इसे घोषित या catch करने के लिए मजबूर नहीं करना है, तो कस्टम एक्सेप्शन किस बेस क्लास को extend करे?
- Exception
- Throwable
- RuntimeException
- Error
Answer
RuntimeException — RuntimeException (और इसकी सबक्लास) unchecked होती हैं — कम्पाइलर throws घोषणा या catch ब्लॉक की माँग नहीं करता।