C ++ में एक्सेप्शन हैंडलिंग क्या है?
C ++ में अपवाद हैंडलिंग आपको रनटाइम त्रुटियों जैसी अप्रत्याशित परिस्थितियों से निपटने का एक तरीका प्रदान करता है। इसलिए जब भी कोई अप्रत्याशित परिस्थिति आती है, प्रोग्राम कंट्रोल को हैंडलर के रूप में जाने वाले विशेष कार्यों में स्थानांतरित कर दिया जाता है।
अपवादों को पकड़ने के लिए, आप अपवाद निरीक्षण के तहत कोड का कुछ भाग रखते हैं। कोड का अनुभाग ट्राइ-कैच ब्लॉक के भीतर रखा गया है।
यदि कोड के उस खंड के भीतर एक असाधारण स्थिति होती है, तो एक अपवाद फेंक दिया जाएगा। अगला, अपवाद हैंडलर कार्यक्रम का नियंत्रण लेगा।
यदि कोई असाधारण परिस्थिति उत्पन्न नहीं होती है, तो कोड सामान्य रूप से निष्पादित होगा। संचालकों की अनदेखी होगी।
इस C ++ ट्यूटोरियल में, आप सीखेंगे:
- C ++ में एक्सेप्शन हैंडलिंग क्या है?
- अपवाद हैंडलिंग क्यों?
- अपवाद हैंडलिंग कीवर्ड
- वाक्य - विन्यास:
- C ++ मानक अपवाद
- उपयोगकर्ता-परिभाषित अपवाद
अपवाद हैंडलिंग क्यों?
यहाँ, C ++ में अपवाद हैंडलिंग का उपयोग करने का कारण हैं:
- आप अपनी त्रुटि से निपटने के कोड को अपने सामान्य कोड से अलग कर देंगे। कोड अधिक पठनीय और बनाए रखने में आसान होगा।
- फ़ंक्शंस उनके द्वारा चुने गए अपवादों को संभाल सकते हैं। यहां तक कि अगर एक फ़ंक्शन कई अपवादों को फेंकता है, तो यह केवल कुछ को संभाल लेगा। कॉल करने वाला बिना किसी अपवाद के हैंडल करेगा।
अपवाद हैंडलिंग कीवर्ड
C ++ में अपवाद हैंडलिंग इन तीन कीवर्ड के चारों ओर घूमती है:
- फेंक - जब एक कार्यक्रम एक समस्या का सामना करता है, तो यह एक अपवाद फेंकता है। थ्रो कीवर्ड प्रोग्राम को थ्रो करने में मदद करता है।
- पकड़ - एक प्रोग्राम अपवाद को पकड़ने के लिए एक अपवाद हैंडलर का उपयोग करता है। यह एक कार्यक्रम के अनुभाग में जोड़ा जाता है जहां आपको समस्या को संभालने की आवश्यकता होती है। यह कैच कीवर्ड का उपयोग करके किया जाता है।
- कोशिश - कोशिश ब्लॉक कोड ब्लॉक की पहचान करता है जिसके लिए कुछ अपवादों को सक्रिय किया जाएगा। इसके बाद एक / अधिक कैच ब्लॉक होना चाहिए।
मान लीजिए कि एक कोड ब्लॉक एक अपवाद बढ़ाएगा। कीवर्ड को आज़माने और पकड़ने के तरीके का उपयोग करके अपवाद पकड़ा जाएगा। कोशिश / कैच ब्लॉक को कोड को घेरना चाहिए जो एक अपवाद फेंक सकता है। ऐसे कोड को संरक्षित कोड के रूप में जाना जाता है।
वाक्य - विन्यास:
इस वाक्य रचना को पकड़ने / पकड़ने की कोशिश करता है:
try {// the protected code} catch( Exception_Name exception1 ) {// catch block} catch( Exception_Name exception2 ) {// catch block} catch( Exception_Name exceptionN ) {// catch block}
- यद्यपि हमारे पास एक प्रयास कथन है, हम कई कैच स्टेटमेंट ले सकते हैं।
- ExceptionName पकड़े जाने वाले अपवाद का नाम है।
- अपवादों को संदर्भित करने के लिए अपवाद 1, अपवाद 2 और अपवाद एन आपके परिभाषित नाम हैं।
उदाहरण 1:
#include#include using namespace std;int main() {vector vec;vec.push_back(0);vec.push_back(1);// access the third element, which doesn't existtry{vec.at(2);}catch (exception& ex){cout << "Exception occurred!" << endl;}return 0;}
आउटपुट:
यहाँ कोड का एक स्क्रीनशॉट है:
कोड स्पष्टीकरण:
- अपने कार्यों का उपयोग करने के लिए कार्यक्रम में iostream हेडर फ़ाइल शामिल करें।
- अपने कार्यों का उपयोग करने के लिए कार्यक्रम में वेक्टर हेडर फ़ाइल शामिल करें।
- कार्यक्रम में एसटीडी नेमस्पेस को बिना बुलाए अपनी कक्षाओं में शामिल करें।
- मुख्य () फ़ंक्शन को कॉल करें। कार्यक्रम तर्क को इसके शरीर के भीतर जोड़ा जाना चाहिए।
- पूर्णांक डेटा संग्रहीत करने के लिए vec नामक वेक्टर बनाएं।
- वेक्टर नाम के वेक्टर में तत्व 0 जोड़ें।
- वेक्टर नाम के वेक्टर में तत्व 1 जोड़ें।
- एक टिप्पणी। इसे C ++ कंपाइलर द्वारा छोड़ दिया जाएगा।
- अपवाद को पकड़ने के लिए कोशिश कथन का उपयोग करें। {कोशिश / पकड़ ब्लॉक के शरीर की शुरुआत के निशान। शरीर के भीतर जोड़ा गया कोड संरक्षित कोड बन जाएगा।
- वेक्टर नाम के वेक्टर के सूचकांक 2 (तीसरे तत्व) पर संग्रहीत तत्व तक पहुंचने का प्रयास करें। यह तत्व मौजूद नहीं है।
- कोशिश / पकड़ ब्लॉक के शरीर का अंत।
- अपवाद को पकड़ो। लौटे त्रुटि संदेश चर पूर्व में संग्रहीत किया जाएगा।
- यदि अपवाद पकड़ा जाता है, तो कंसोल पर कुछ संदेश प्रिंट करें।
- पकड़ ब्लॉक के शरीर का अंत।
- कार्यक्रम को सफल निष्पादन पर एक मूल्य वापस करना चाहिए।
- मुख्य () फ़ंक्शन बॉडी का अंत।
उदाहरण 2:
#includeusing namespace std;double zeroDivision(int x, int y) {if (y == 0) {throw "Division by Zero!";}return (x / y);}int main() {int a = 11;int b = 0;double c = 0;try {c = zeroDivision(a, b);cout << c << endl;}catch (const char* message) {cerr << message << endl;}return 0;}
आउटपुट:
यहाँ कोड का एक स्क्रीनशॉट है:
कोड स्पष्टीकरण:
- अपने कार्यों का उपयोग करने के लिए कार्यक्रम में iostream हेडर फ़ाइल शामिल करें।
- कार्यक्रम में एसटीडी नेमस्पेस को बिना बुलाए अपनी कक्षाओं में शामिल करें।
- एक फ़ंक्शन बनाएं जिसका नाम जीरोडिविज़न है जो दो पूर्णांक तर्क, एक्स और वाई लेता है। फ़ंक्शन को दोहरा परिणाम देना चाहिए।
- चर कथन y का मान 0. है या नहीं यह जाँचने के लिए एक कथन का उपयोग करें। {{अगर शरीर की शुरुआत हो तो निशान।
- यदि संदेश 0 है तो लौटाया / फेंका जाएगा।
- अगर बयान के शरीर का अंत।
- शून्यडिवीज़न फ़ंक्शन को x / y का मान वापस करना चाहिए।
- शून्यडिवीज़न फ़ंक्शन के शरीर का अंत।
- मुख्य () विधि को बुलाओ। {इस विधि की शुरुआत के निशान।
- एक पूर्णांक चर घोषित करें और इसे मान 11 प्रदान करें।
- पूर्णांक चर b घोषित करें और इसे मान 0 प्रदान करें।
- एक डबल चर c घोषित करें और इसे 0 मान दें।
- अपवाद को पकड़ने के लिए कोशिश कथन का उपयोग करें। {कोशिश / पकड़ ब्लॉक के शरीर की शुरुआत के निशान। शरीर के भीतर जोड़ा गया कोड संरक्षित कोड बन जाएगा।
- शून्यडिवीज़न फ़ंक्शन को कॉल करें और ए और बी के तर्क पास कर रहे हैं, अर्थात्, 11 और 0. इस ऑपरेशन का परिणाम चर सी में संग्रहीत किया जाएगा।
- कंसोल पर वैरिएबल c का मान प्रिंट करें।
- कोशिश / पकड़ ब्लॉक के शरीर का अंत।
- अपवाद को पकड़ो। लौटे त्रुटि संदेश को चर संदेश में संग्रहीत किया जाएगा।
- कंसोल पर दिए गए त्रुटि संदेश को प्रिंट करें।
- पकड़ ब्लॉक के शरीर का अंत।
- कार्यक्रम को सफल निष्पादन पर एक मूल्य वापस करना चाहिए।
- मुख्य () फ़ंक्शन बॉडी का अंत।
C ++ मानक अपवाद
C ++ मानक अपवादों की एक सूची के साथ आता है जिसे <अपवाद> वर्ग में परिभाषित किया गया है। ये नीचे वर्णित हैं:
अपवाद | विवरण |
एसटीडी :: अपवाद | यह एक अपवाद है और सभी मानक C ++ अपवादों का मूल वर्ग है। |
std :: bad_alloc | यह अपवाद नए कीवर्ड द्वारा फेंका गया है। |
std :: bad_cast | यह डायनेमिक_कास्ट द्वारा फेंका गया एक अपवाद है। |
std :: bad_exception | सी ++ कार्यक्रमों में अप्रत्याशित अपवादों से निपटने के लिए एक उपयोगी उपकरण। |
std :: bad_typeid | टाइपिड द्वारा फेंका गया एक अपवाद। |
std :: लॉजिक_रोर | कोड पढ़कर यह अपवाद सैद्धांतिक रूप से पता लगाने योग्य है। |
std :: domain_error | यह गणितीय रूप से अमान्य डोमेन का उपयोग करने के बाद फेंका गया एक अपवाद है। |
std :: अमान्य_argument | अमान्य तर्कों का उपयोग करने के लिए फेंका गया एक अपवाद। |
std :: length_error | एक बड़ा std :: string बनाने के बाद फेंका गया एक अपवाद। |
std :: out_of_range | विधि से फेंके। |
std :: runtime_error | यह एक अपवाद है जिसे कोड को पढ़ने के माध्यम से पता नहीं लगाया जा सकता है। |
std :: overflow_error | गणितीय अतिप्रवाह की घटना के बाद इस अपवाद को फेंक दिया जाता है। |
std :: range_error | जब आप किसी आउट-ऑफ-रेंज मान को संग्रहीत करने का प्रयास करते हैं तो यह अपवाद फेंक दिया जाता है। |
std :: underflow_error | गणितीय बहिर्वाह की घटना के बाद फेंका गया एक अपवाद। |
उपयोगकर्ता-परिभाषित अपवाद
C ++ std :: अपवाद वर्ग हमें उन वस्तुओं को परिभाषित करने की अनुमति देता है जिन्हें अपवाद के रूप में फेंका जा सकता है। इस वर्ग को <अपवाद> शीर्षलेख में परिभाषित किया गया है। क्लास हमें एक वर्चुअल मेम्बर फंक्शन प्रदान करता है जिसका नाम है।
यह फ़ंक्शन टाइप चार * का एक शून्य-वर्ण वर्ण अनुक्रम देता है। अपवादित विवरण के लिए हम इसे व्युत्पन्न वर्गों में अधिलेखित कर सकते हैं।
उदाहरण:
#include#include using namespace std;class newException : public exception{virtual const char* what() const throw(){return "newException occurred";}} newex;int main() {try {throw newex;}catch (exception& ex) {cout << ex.what() << '\n';}return 0;}
आउटपुट:
यहाँ कोड का एक स्क्रीनशॉट है:
कोड स्पष्टीकरण:
- हमारे कार्यक्रम में iostream हेडर फ़ाइल शामिल करें। हम त्रुटियों को प्राप्त किए बिना इसके कार्यों का उपयोग करेंगे।
- हमारे कार्यक्रम में अपवाद शीर्ष लेख फ़ाइल शामिल करें। हम इसके कार्यों का उपयोग करेंगे जैसे बिना त्रुटियों के।
- हमारे प्रोग्राम में std नेमस्पेस को शामिल करें, बिना कॉल किए उसकी कक्षाओं का उपयोग करने के लिए।
- NewException नाम का एक नया वर्ग बनाएं। यह वर्ग C ++ का अपवाद वर्ग है।
- वर्ग शरीर की शुरुआत।
- अपवाद शीर्ष लेख फ़ाइल में परिभाषित () क्या आभासी सदस्य फ़ंक्शन को अधिलेखित करें। फिर हम अपने स्वयं के अपवाद, नए अपवाद का वर्णन करेंगे।
- नए अपवाद की परिभाषा शुरू करें।
- यदि नया अपवाद पकड़ा गया है तो संदेश वापस किया जाएगा।
- नए अपवाद की परिभाषा का अंत।
- कक्षा newException के शरीर का अंत। Newex हमारे नए अपवाद को पकड़ने के लिए उपयोग किया जाने वाला नाम है, जिसके बाद newException कहा जाएगा।
- मुख्य () फ़ंक्शन को कॉल करें। कार्यक्रम तर्क को इसके शरीर के भीतर जोड़ा जाना चाहिए। {इसके शरीर की शुरुआत के निशान।
- कोड को चिह्नित करने के लिए एक प्रयास विवरण का उपयोग करें जिसके भीतर हमें अपवाद को चिह्नित करने की आवश्यकता है। {कोशिश / पकड़ ब्लॉक के शरीर की शुरुआत के निशान। इससे घिरा हुआ कोड संरक्षित हो जाएगा।
- यदि यह पकड़ा जाता है तो newex अपवाद को फेंक दें।
- कोशिश शरीर का अंत।
- अपवाद को पकड़ने के लिए कैच स्टेटमेंट का उपयोग करें। अपवाद त्रुटि संदेश चर पूर्व में संग्रहीत किया जाएगा।
- कंसोल पर अपवाद त्रुटि संदेश मुद्रित करें।
- कैच स्टेटमेंट का अंत।
- यदि यह सफलतापूर्वक निष्पादित होता है, तो प्रोग्राम को एक मूल्य वापस करना चाहिए।
- मुख्य () फ़ंक्शन के शरीर का अंत।
सारांश:
- C ++ में अपवाद हैंडलिंग के साथ, आप रनटाइम त्रुटियों को संभाल सकते हैं।
- रनटाइम त्रुटियाँ प्रोग्राम निष्पादन के दौरान होने वाली त्रुटियाँ हैं।
- अपवाद हैंडलिंग आपको अपने कार्यक्रम में किसी भी अप्रत्याशित परिस्थितियों को संभालने में मदद करता है।
- जब अप्रत्याशित परिस्थिति होती है, तो प्रोग्राम कंट्रोल को हैंडलर में स्थानांतरित कर दिया जाता है।
- अपवाद को पकड़ने के लिए, आप कोड के एक हिस्से को ट्राइ-कैच ब्लॉक के तहत रखते हैं।
- थ्रो कीवर्ड प्रोग्राम को अपवाद को फेंकने में मदद करता है, प्रोग्राम को समस्या को संभालने में मदद करता है।
- कोशिश कीवर्ड कोड ब्लॉक की पहचान करने में मदद करता है जिसके लिए कुछ अपवाद सक्रिय हो जाएंगे।
- हम अपने अपवादों को परिभाषित करने के लिए अपवाद शीर्ष लेख फ़ाइल के क्या () फ़ंक्शन को अधिलेखित कर सकते हैं।