# कस्टम एक्सेप्शन व मल्टी-कैच — कोर जावा

Source: https://www.geekswithgeeks.com/hi/core-java/java-exceptions-deep-dive

> अपने खुद के एक्सेप्शन टाइप डिज़ाइन करें जो सार्थक संदर्भ रखें, और एक संक्षिप्त catch क्लॉज़ में कई एक्सेप्शन टाइप संभालें।

## एक कस्टम checked एक्सेप्शन

callers को संभालना ही होगा ऐसे checked एक्सेप्शन के लिए `Exception` एक्सटेंड करें, या प्रोग्रामिंग त्रुटि दर्शाने वाले unchecked के लिए `RuntimeException`। मूल कारण को हमेशा chain करें ताकि stack trace पूरा रहे।

```java
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 और साझा सुपरटाइप का होता है।

```java
try {
    process(file);
} catch (IOException | ParseException e) {
    log.error("could not process file", e);
    throw new RuntimeException(e);
}
```

## संदर्भ के साथ दोबारा फेंकें, छुपाएँ नहीं

निम्न-स्तर के एक्सेप्शन को पकड़कर अधिक सार्थक एक्सेप्शन फेंकना अच्छी प्रथा है — **बशर्ते मूल को कारण के रूप में आगे भेजें** (`new ServiceException("...", e)`), कभी न छोड़ें, वरना असली मूल कारण प्रोडक्शन लॉग में अदृश्य हो जाता है।

त्वरित जाँच

**Quiz:** अगर callers को इसे घोषित या catch करने के लिए मजबूर नहीं करना है, तो कस्टम एक्सेप्शन किस बेस क्लास को extend करे?

- [ ] Exception
- [ ] Throwable
- [x] RuntimeException
- [ ] Error

*Answer:* RuntimeException. RuntimeException (और इसकी सबक्लास) unchecked होती हैं — कम्पाइलर throws घोषणा या catch ब्लॉक की माँग नहीं करता।
