Exception Handling in C++

Exception Handling in C++: Exceptions C++ में जोडा गया एक बहुत ही उपयोगी Concept है। Exceptions का प्रयोग करके हम Robust Codes लिख सकते हैं, जिनमें विभिन्न प्रकार के Errors का समाधान Program में पहले ही कर दिया जाता है। Borland C++ की ObjectWindow Library (OWL) व Template Class Library साथ ही Microsoft Company की MFC Library में भी Exceptions का प्रयोग किया गया है। इसलिए हमें ये समझना बहुत जरूरी है, कि Exceptions क्या होते हैं और Program के Runtime में Generate होने वाले Errors को इस तकनीक द्वारा किस प्रकार से Debug किया जा सकता है।

Program के Runtime में विभिन्न C++ Classes द्वारा जो Runtime Errors Generate होती हैं, Exceptions उन्हे Handle करने का एक Systematic Object Oriented Approach प्रदान करता है। किसी Error को तभी Exception कहा जा सकता है। जब वह Error Program में किसी Action के दौरान Run Time में Generate हो और Program स्वयं उस Error को Discover करे।

उदाहरण के लिए User द्वारा बनाई गई एक String Class में Exception Generate हो सकता है, Program ये Check कर सकता है कि कोई File ठीक से Open हुई या नहीं। यदि File ठीक से Open नहीं हुई हैं, तो एक Exception Generate हो सकता है।

सभी प्रकार की Run Time Errors को Exceptions के रूप में Handle नहीं किया जा सकता है। उदाहरण के लिए कुछ Errors Program द्वारा Detect नहीं होती हैं बल्कि Operating System द्वारा Detect होती हैं। ये Errors Program को Terminate कर देती हैं।

जैसे यदि Stack Overflow हो जाए, किसी Key Combination को Press करने पर या किसी Hardware समस्या से भी Program Terminate हो जाता है। इस प्रकार की Error को हमारा Program नहीं बल्कि Operating System Detect करता है। “C” में किसी Error को किसी Function द्वारा Return होने वाली Return Value के आधार पर Detect किया जाता था।

उदाहरण के लिए कई Math Functions जैसे कि sin(), cos(), sqrt() आदि में जब कोई Error Generate होती है तो] ये Functions एक Special मान Return करते हैं और जब Disk File Function में किसी प्रकार की Error Generate होती है, तो वह Function NULL या 0 Return करता है, जिसका मतलब होता है कि File Open नहीं हो सकी है। एक “C” Programmer जितनी बार भी इन Functions को Call करता है, वह इनकी Return Value को निम्नानुसार Check करता है:

	if( somefunc() == ERROR_RETURN_VALUE )
	   // handle the error or call error-handler function
	else
	   // proceed normally
	if( anotherfunc() == NULL )
	   // handle the error or call error-handler function
	else
	   // proceed normally
	if( thirdfunc() == 0 )
	   // handle the error or call error-handler function
	else
	   // proceed normally

इस Approach को Use करने पर परेशानी ये होती है कि इस प्रकार के किसी भी Function को Call करने पर Function की Return Value को Examine करना पडता है। हर Function Call के साथ एक if … else Statement होता है और इस Statement में Function की Return Value को Check किया जाता है। यदि Error होती है, तो Error Handler को Call किया जाता है या फिर Error को इसी Statement Block में Handle किया जाता है। इससे Program के Source कोड काफी बडे हो जाते हैं। साथ ही ऐसा भी होता है कि कुछ Functions Error Value में मान Return ही नहीं करते हैं।

जैसे मानलो कि min() Function दो मानों में से छोटे मान को Return करता है। इस Function से जो भी छोटा से छोटा मान Return होगा वह एक Valid मान होगा। ये Function Error Value Return ही नहीं करता है, जिसे Check किया जा सके कि Function ठीक तरह से Perform हुआ या नहीं।

ये समस्या तब तो और भी ज्यादा Complex हो जाती है जब Classes का प्रयोग किया जाता है क्योंकि बिना Function Call हुए भी Error Generate हो सकती है। उदाहरण के लिए मानलो एक Application निम्नानुसार किसी Class के Objects Define करता है:

SomeClass obj1, obj2, obj3;

अब यदि Class के Contractor में कोई Error Generate होती है, तो Application उस Error को कैसे Detect करेगा। Constructor तो अदृश्‍य रूप से Call होता है और Constructor कोई मान भी Return नहीं करता। इसलिए किसी Return Value को Check नहीं किया जा सकता।

समस्या तब और भी ज्यादा जटिल हो जाती है जब Application में पूरी Class Library का प्रयोग किया जाता है। एक Class Library को कुछ अलग Programmer बनाते हैं और Application Program को कुछ अलग लोग Develop करते हैं। इससे Program व Class के Member Functions से Return होने वाले Error Values को Arrange करना और भी ज्यादा मुश्किल हो जाता है।

इस प्रकार की परेशानियों को कम करने और Errors को Handle करने के लिए एक सरल तरीका प्रदान करने के लिए Exception Mechanism Design किया गया है, जो कि OOP के Concept को Support करता है। इस तकनीक में सभी Errors को एक ही स्थान पर Handle किया जाता है और Program के Normal Code से इन Error Handling Statements का कोई Link नहीं होता है। इनका Link केवल तभी बनता है जब कोई Error Generate होता है।

मानलो कि कोई Application किसी Class के Objects Create करता है और उनसे Interact करता है। सामान्‍यतया Application जब किसी Object के लिए किसी Member Function को Call करता है, तब Member Function को किसी प्रकार की परेशानी नहीं होती है।

लेकिन कई बार Member Function में कोई Error Generate हो जाती है। ये Member Function अपने Application को उस Error के बारे में Inform करता है। Member Functions द्वारा Generate हुए Error को Handle करने के लिए जब Exception को Use किया जाता है, तब इसे “throwing an exception” कहा जाता है। Application में इस Member Function द्वारा Generate होने वाली Error को Handle करने के लिए अलग से Code Segment लिखा जाता है।

इस Code Segment को “Exception Handler” या “catch Block” कहा जाता है, जो कि Member Functions द्वारा throw किए जाने वाले Exceptions को catch करता है। किसी Class के किसी Object को Use करने वाले जितने भी Codes होते हैं, उन्हें try Block में लिखा जाता है। try Block में Generate होने वाले Errors को catch Block में catch कर लिया जाता है। वे Codes जो कि Class से Interact नहीं करते हैं, उन्हें try Block में लिखने की जरूरत नहीं होती है।

Exception Mechanism में तीन नए Keywords throw, catchtry Use किए गए हैं। साथ ही Class Creator को एक नए प्रकार की Entity Create करनी पडती है जिसे “Exception Class” कहते हैं। निम्न Program Exception Mechanism के Features को Demonstrate कर रहा है।

	// Not a working program
	class AClass                         	// a class
	{
		public:
		class AnError                     	// exception class
		{
		};

		void Func()                       	// a member function
		{
			if( /* error condition */ )
				throw AnError();        // throw exception
		}
	};

	void main()                          	// application
	{
		try                               	// try block
		{
			AClass obj1;                   	// interact with AClass objects
			obj1.Func();                   	// may cause error
		}

		catch(AClass::AnError)            	// exception handler
		{                              		// (catch block)
			// tell user about error, etc.
		}	
	}

इस Code Segment की Listing एक Class से शुरू होती है जिसका नाम AClass है, जो कि किसी Class को Represent करता है, जिसमें Error Generate हो सकती है। इस Class के Public Part में एक Exception Class AnError को Specify किया गया है। AClass का Member Function AClass की Errors को Check करता है। यदि उसे कोई Error मिलती है, तो ये Application को एक Exception throw करता है। किसी Exception को throw करने के लिए एक Keyword throw के बाद Exception Class के Constructor को लिखा जाता है।

उपरोक्त Program में निम्न Statement द्वारा Class में Generate होने वाली Exception को Application में throw किया गया है:

throw AnError();  // ‘throw’ followed by constructor for AnError class

Program के main() Part में हमने उन Statements को] जो कि Class से Interact करते हैं, एक try Block में लिखा है। यदि इन में से किसी भी Statement के कारण AClass के Member Functions में किसी भी प्रकार की Error Generate होती है, तो एक Exception को throw किया जाता है। Application में Exception throw प्राप्त होने पर Program Control को try Block के Just बाद में लिखे हुए catch Block में जाता है।

किसी Exception के निम्न Features होते हैं:

  • Exception एक विशेष स्थिति होती है, जिसे Special Handling की आवश्‍यकता होती है। Exceptions का प्रयोग Program के Errors की Handling के लिए किया जाता है।
  • Exception Create करने के लिए एक Statement एक Object throw करता है। ये Object Exception की प्रकृति को Describe करता है। ये Object एक Literal Value, एक String, किसी Class का एक Object या कोई अन्‍य Object हो सकता है। ये जरूरी नहीं है कि Exception Object हमेंशा किसी Class का Object हो लेकिन अक्सर ये एक Class का Object होता है।
  • एक Exception को Handle करने के लिए किसी Process द्वारा throw किए गए Exception को एक catch Statement Catch करता है। catch Exception के Statements को Exception Handler कहा जाता है।
  • Program Exceptions को catch करने के लिए एक या एक से अधिक Statements को Prepare करता है, जो कि Exception throw कर सकता है। सामान्‍यतया Exceptions को Use करने के लिए हम एक या एक से अधिक Statements को Try करते हैं और statements द्वारा throw किए गए Exceptions को catch करते हैं।

जब कोई Member Function कोई exception throw करता है, तब इसके दो Effect होते हैं:

  • ये बताता है कि एक Exception Condition Detect हुई है। ये एक Error Condition हो सकता है, लेकिन Error के अलावा भी ये कुछ अलग स्थिति को Represent कर सकता है, जिसे Special Handling की जरूरत होती है।
  • ये Application Program से Request करता है कि वह किसी Exception Handler से इस Problem को Solve करे। यदि Handler Program में लिखा गया होता है, तो Exception throw होने के Response में वह Handler Automatically Call हो जाता है।

Program एक Exception को सामान्‍यतया एक throw Statement द्वारा Application में throw करता है, जैसाकि हमने पिछले Code Segment में देखा है। जैसे:

throw 1;

सामान्‍यतया हमें इस तरह के Literal Integer को throw नहीं करना चाहिए। इनका कोई विशेष अर्थ नहीं होता है। इसके स्थान पर यदि हम निम्नानुसार कोई String throw करते हैं, तो ये ज्यादा Meaningful होता है:

throw “Overflow;

Program में इस String को Handle करने वाले String-Exception Handler द्वारा इस String Object को catch करके Display किया जा सकता है। ये Handler इस Object के Type को catch Expression में Specify करता है। हमारे उदाहरण में ये Object एक String है और इसे const char* द्वारा Specify किया जा रहा है। यानी

	catch(const char* message)
	{
		cout << “Error! – “ << message << endl;
		// Other actions in response to the exception
	}

Catch Statement throw किए गए String-Exception Object को catch करता है और उसे Output में Display करता है। catch Statement के Execution के बाद Program वापस Continue हो जाता है या हम चाहें तो Program को Halt कर सकते हैं, किसी अन्‍य Function को Call कर सकते हैं या एक Loop द्वारा उस Condition को वापस शुरू कर सकते हैं, जिसमें Exception Generate हुआ था। यानी इस catch Block में हम जो चाहें वो कर सकते हैं।

Exception Conditions को Report करने व उसके साथ Deal करने का Exception एक Mechanism है। किसी Exception को किस प्रकार से Handle करना है, ये Programmer ही तय करता है।

यदि हम Exception की परिभाषा देना चाहें तो हम कह सकते हैं कि Exceptions वे Objects होते हैं जो कि किसी Function के Argument की तरह दिखाई देते हैं। Exceptions किसी भी प्रकार के Object हो सकते हैं लेकिन सामान्‍यतया वे किसी Class के Instance की तरह होते हैं। उदाहरण के लिए हम एक Overflow Class को Declare कर सकते हैं। इसे किसी और चीज की जरूरत नहीं होती है। इसका नाम ही काफी होता है। जैसे:

Class Overflow{};

हम इस Class के Instance को एक Exception की तरह throw कर सकते हैं। जैसे

throw Overflow();

ये Statement Overflow Class का एक Object Create करता है और उस Object को उस किसी Member Function को Call करने वाले को भेज देता है। Program में इस Exception Object को catch कर लिया जाता है और उसके साथ किसी प्रकार की प्रक्रिया की जाती है। जैसे:

	catch(Overflow)
	{
		Cout << “Overflow Detected” << endl;
	}

catch Block में Overflow Object का Present होना इस बात को Indicate करता है कि कोई Exception throw किया गया है। ये Object कुछ भी नहीं करता है और इसमें कुछ भी नहीं होता है। throw Statement Overflow Class का एक Object throw करता है, जिसे Program में catch किया जाता है। हम किसी भी catch Statement को निम्नानुसार लिख सकते हैं, जो कि throw किए गए Exception Object को Argument के रूप में catch Statement में catch करता है।

	catch (Overflow overObject)
	{
		// . . . 
	}

इस Statement में catch Statement Exception Object को एक नाम overObject प्रदान कर देता है। catch Block के अन्‍य Statements इस Object का उसी प्रकार से प्रयोग कर सकते हैं, जिस प्रकार से किसी Function के विभिन्न Arguments उस Function के Arguments का प्रयोग करते हैं। उदाहरण के लिए एक Exception Class Member Function Provide करता है, जिन्हें catch Expression Call कर सकता है। जैसे

	class Overflow 
	{
		void Report()
		{ 
		  cout << "Error: overflow" << endl; 
		}
	};

इस Code Segment में Class Overflow Report नाम का एक Member Function Declare कर रहा है जो कि एक Error को Display करता है। हमने Report को एक Inline Function बनाया है, लेकिन हम इसे अलग से भी Implement कर सकते हैं। catch Statement इस Report Member Function को निम्नानुसार Call करके Error Message को Display कर सकता है। जैसे: (Exception Handling in C++ – TutorialsPoint)

	catch (Overflow overObject) 
	{
	  overObject.Report();  // Calls Report function for thrown object
	}

CPP Programming Language in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook C++ Programming Language in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

C++ Programming Language in Hindi | Page: 666 | Format: PDF

BUY NOW GET DEMO REVIEWS