C++ Exception Class: Exception Class के Data को Public रखना चाहिए ताकि Exception Class के Data को Exception Handler Directly Access कर सके। नए Exception Class के Specification को हम निम्नानुसार देख सकते हैं:
class InchesEx // exception class { public: char origin[80]; // for name of routine float iValue; // for faulty inches value InchesEx(char* or, float in) // 2-arg constructor { strcpy(origin, or); // put string in object iValue = in; // put inches value in object } };
इस Specification में एक String को Hold करने के लिए Variable Declare किया गया है। इस Variable में Call किए गए Member Function का नाम होता है। दूसरा Variable float प्रकार का है जिसमें Inches का गलत मान होता है।
C++ Exception Class: Initializing Exception Object
जब एक Exception throw होता है तब हम उस Object को कैसे Initialize कर सकते हैं? InchesEx Class के 2-Arguments Constructor में हमने निम्नानुसार Statement Use किया था%
throw InchesEx(“2-arg constructor”, in);
और getdist() Member Function में हमने निम्न Statement Use किया है:
throw InchesEx(“getdist() function”, in);
जब Exception throw होता है, तब Handler एक String व Inches का मान Display करता है। String हमें बताता है कि किस Member Function में Exception Generate हुआ है यानी कौनसा Member Function Exception throw कर रहा है और Variable in का मान Faulty Inches के मान को दर्शाता है। ये Additional Data Programmer व User को ये बता सकते हैं कि गलती कहां पर हुई है।
C++ Exception Class: Accessing Exception Object Data
जब Exception catch होता है, तब हम catch होने वाले Data को किस प्रकार से Extract कर सकते हैं? इसका सबसे सरल तरीका ये है कि Exception Class के Data को Public रखा जाए, जैसाकि हमने किया है। फिर catch Block में हम Exception Object का एक नाम Declare कर सकते हैं, जिसमें Exception Object का मान Copy हो जाएगा।
हमने हमारे उदाहरण में ये काम करने के लिए निम्नानुसार Exception Class का एक Object ix Declare किया है। इस ix नाम को Dot Operator के साथ Use करके हम Object के किसी भी Data को Access कर सकते हैं।
catch(Distance::InchesEx ix) { // access 'ix.origin' and 'ix.iValue' directly }
हम ix.origin व ix.iValue Statement द्वारा Exception Object के Data Members के मानों को Display कर सकते हैं। इस Program का Output उस समय निम्नानुसार होता है जब हम Inches का मान 11 से अधिक Input करते हैं।
Enter feet: 5 Enter inches: 23.5 Initialization error in getdist() function. Inches value of 23.5 is too large.
इसी तरह से यदि Programmer main() Function में dist1 की Definition को निम्नानुसार Change करता है:
Distance dist1(15, 50.2);
ते Resulting Exception निम्न Error Message प्रदान करता है:
Initialization error in 2-arg constructor.
Inches value of 22.25 is too large.
कई Compilers में Built-In Exception Classes होती हैं। सबसे ज्यादा दिखाई देने वाली Exception Class xalloc है, जो कि तब throw होता है जब new Operator द्वारा Memory Allocate करते समय कोई Exception Generate होता है। निम्न Program में इस Exception Class को Use किया गया है:
// demonstrates xalloc class (for Borland compilers) #include <iostream.h> #include <conio.h> #include <except.h> // for xalloc class void main() { const unsigned int MAX = 60000; // memory size (chars) char* ptr; // pointer to memory unsigned int j; // loop variable try { ptr = new char[MAX]; // allocate memory // other statements that use 'new' } catch(xalloc) // exception handler { cout << "\nxalloc exception: can't allocation memory."; exit(1); } for(j=0; j<MAX; j++) // fill memory with data *(ptr+j) = j%128; for(j=0; j<MAX; j++) // check data if(*(ptr+j) != j%128) { cout << "\nData error"; exit(1); } delete[] ptr; // release memory cout << "\nMemory use is successful."; }
हमें इस Program में except.h नाम की Header File को इसलिए Include करना पडता है, क्योंकि xalloc Class की Specification इसी Header File में है। यदि हम इस Program में MAX का मान 60000 से ज्यादा करते हैं तो xalloc का Exception Class Program को एक Exception throw करता है और एक Error Message Show करता है।
जब कोई Exception throw होता है तब जिस Object की Coding से Exception Generate होता है, उस Object की Class का Destructors Automatically Call हो जाता है। ऐसा होना जरूरी भी है क्योंकि Application ये नहीं जानता होता है कि किस Statement द्वारा Exception Generate हुआ है और यदि Application Error से Recover होना चाहे] तो इसे try Block के शुरूआत से Start होना पडता है। Exception Mechanism ये निश्चित कर देता है कि try Block में लिखे Codes किसी Exception के Generate होने पर try Block फिर से Reset हो जाएगा।
जब कोई Exception catch होता है, तब हम सामान्यतया Application को Terminate नहीं करना चाहते हैं। Exception Mechanism हमें एक Chance देता है, जिससे हम ये पता लगा सकते हैं कि हमने क्या गलती की है। User भी जब Program को Use करता है तो उसे भी पता चल जाता है कि उसने ऐसा क्या किया है, जिससे Exception Generate हुआ है। इससे User Program को Terminate करने से पहले Clean up का काम पूरा कर सकता है।
Exceptions से try Block में Created Objects के Destructors को भी Execute होने में आसानी होती है जिससे Clean Up का काम आसानी से हो जाता है। Clean Up से हमारा मतलब है कि Create होने वाले सभी Objects पूरी तरह से Destroy हो जाते हैं और Memory Release हो जाती है। सामान्यतया DOS Programs Terminate होते ही System Resources को Free कर देते हैं जबकि Windows Based Programs ऐसा नहीं करते हैं।
कुछ स्थितियों में हम हमारे Program को Terminate करना चाहते हैं। try Block के लिए ये भी सम्भव है कि वह Error से Recover हो जाए। ऐसे में Error के Recover होने पर User Correct Data Input कर सकता है।
जब इस प्रकार की स्थिति होती है तब try व catch Block को एक Loop में लिखा जाता है। ताकि Control try की शुरूआत में पहुंच सके, जिसे Exception Mechanism ने उसकी Initial स्थिति में Restore कर दिया होता है। यदि Program में कोई ऐसा Exception throw होता है जिसके लिए Handler नहीं लिखा गया है, तो Program Terminate हो जाता है।
C++ Exception Class: Exception and Function Nesting
जो Statement Exception Generate करता है, ये जरूरी नहीं है कि उसे try Block के Statement के रूप में ही लिखा जाए। ये उस Function में भी लिखा जा सकता है जिसे try Block में Call किया जा सकता है। या ऐसे Function में भी हो सकता है जिसे उस Function ने Call किया है जिसे try Block के किसी Statement ने Call किया है। और भी कई स्थितियां हो सकती हैं।
Exception Handler की कोई ऐसी स्थिति नहीं हो सकती है कि Control वहां पर Return हो जाए जहां पर Exception Generate हुआ था। Exception सामान्यतया एक goto Statement की तरह काम करता है ना कि एक Function Call की तरह। किसी Exception के Generate होने पर Control catch Block में पहुंचता है और वहां तब तक रहता है जब तक catch Block के Codes का Execution समाप्त नहीं हो जाता है। ( C++ Exception Class )
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook C++ Programming Language in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
C++ Programming Language in Hindi | Page: 666 | Format: PDF