परिचय
इस सेक्शन में, हम देखेंगे कि C++ में एक्सेप्शन हैंडलिंग के लिए कैच ब्लॉक और टाइप कन्वर्जन का उपयोग कैसे करें।
उदाहरण 1: कैरेक्टर थ्रो करना लेकिन int कैच करना
#include <iostream>
using namespace std;
int main() {
try {
throw 'a'; // कैरेक्टर थ्रो कर रहे हैं
}
catch (int a) { // लेकिन int कैच करने की कोशिश
cout << "Integer value is caught: " << a;
}
catch (...) { // डिफ़ॉल्ट कैच ब्लॉक
cout << "Entering into default catch block";
}
return 0;
}
आउटपुट
Entering into default catch block
व्याख्या
हम देख सकते हैं कि कैरेक्टर 'a' थ्रो किया गया है, लेकिन पहला कैच ब्लॉक int के लिए है। यदि हम सोचते हैं कि 'a' का ASCII एक इंटीजर है, तो पहले ब्लॉक में प्रवेश करना चाहिए, लेकिन **कैच ब्लॉक्स के लिए इस तरह के कन्वर्जन्स लागू नहीं होते**। C++ में कैच ब्लॉक एक्जैक्ट टाइप मैचिंग या डेराइव्ड-टू-बेस कन्वर्जन (पॉइंटर्स/रेफरेंसेस के लिए) की अनुमति देते हैं, लेकिन बिल्ट-इन टाइप्स के बीच इम्प्लिसिट कन्वर्जन (जैसे char से int) की नहीं।
उदाहरण 2: कन्वर्जन कंस्ट्रक्टर कैच ब्लॉक्स के लिए नहीं बुलाया जाता
#include <iostream>
using namespace std;
class TestExcept1 {};
class TestExcept2 {
public:
TestExcept2(const TestExcept1& e) { // कन्वर्जन कंस्ट्रक्टर
cout << "From the Conversion constructor";
}
};
int main() {
try {
TestExcept1 exp1;
throw exp1; // TestExcept1 ऑब्जेक्ट थ्रो कर रहे हैं
}
catch (TestExcept2 e2) { // TestExcept2 कैच करने की कोशिश
cout << "Caught TestExcept2" << endl;
}
catch (...) {
cout << "Entering into default catch block" << endl;
}
return 0;
}
आउटपुट
Entering into default catch block
व्याख्या
थ्रो किए गए ऑब्जेक्ट्स के लिए **कन्वर्जन कंस्ट्रक्टर नहीं बुलाया जाता**। भले ही TestExcept2 में TestExcept1 से कन्वर्जन कंस्ट्रक्टर हो, कैच ब्लॉक इसका उपयोग नहीं करेगा।
महत्वपूर्ण नियम
- कैच ब्लॉक्स में **कोई इम्प्लिसिट टाइप कन्वर्जन नहीं** होता (बिल्ट-इन टाइप्स के लिए)
- कन्वर्जन कंस्ट्रक्टर्स **कैच मैचिंग के लिए उपयोग नहीं किए जाते**
- डेराइव्ड टाइप ऑब्जेक्ट्स को बेस टाइप में कन्वर्ट **नहीं** किया जाता जब डेराइव्ड टाइप थ्रो किया जाता है (स्लाइसिंग होगी यदि वैल्यू से कैच किया जाए)
- पॉलीमॉर्फिक व्यवहार के लिए, बेस क्लास रेफरेंस या पॉइंटर द्वारा कैच करें
सही दृष्टिकोण: रेफरेंस द्वारा कैच करें
try {
throw Derived();
}
catch (const Base& e) { // रेफरेंस द्वारा - कोई स्लाइसिंग नहीं
// पॉलीमॉर्फिक व्यवहार काम करता है
}