PHP try catch – Exception Handling

PHP try catch - Exception Handling - Hindi

PHP try catch – Exception Handling – सामान्यतः जब हम को PHP Program Develop करते हैं, तो उस Program में दो तरह की Errors Generate हो सकती हैं। पहले प्रकार की Errors को Interpreting Time Errors कहा जाता है जबकि दूसरे प्रकार की Errors को Runtime Errors कहा जाता है।

Interpreting Time Errors सामान्यतः Syntactical Errors होती हैं, जहां हम Code लिखते समय किसी तरह की Typing Mistake कर देते हैं और PHP Interpreter उस Error को PHP Program की Parsing करते समय Identify कर लेता है।

जबकि दूसरी तरह की Errors को Runtime Errors कहा जाता है। ये Errors सामान्यतः Logical Errors होती हैं और Logical Errors को Identify करना काफी मुश्किल होता है।

Logical Errors ऐसी Errors होती हैं, जो हमारे Program के किसी Logic के गलत होने की स्थिति में पैदा होता है और Logical Errors को ठीक से Solve किए बिना हमारा Program उपयुक्त Output नहीं देता।

Excepts भी एक प्रकार का Error ही होता है, लेकिन ये एक ऐसा Error होता है, जिसे हम हमारे स्वयं के स्तर पर Handle करने की कोशिश करते हैं। Except वास्तव में एक Unrequited Situation को Represent करता है।

वास्तव में Exceptions भी Run-Time Errors ही होते हैं, लेकिन ये ऐसे Errors होते हैं, जो सामान्यतः किसी Program में सामने नहीं आते और हमारा Program सामान्यत तरीके से काम करता है। लेकिन किसी विशेष स्थिति में ये किसी विशेष Processing या Input के लिए ये Exceptions Trigger हो जाते हैं।

उदाहरण के लिए मानलो कि किसी Program में एक Reverse Loop चल रहा है और उस Loop के Iterator Variable का भाग किसी संख्‍या में दिया जा रहा है। ये भाग देने की प्रक्रिया तब तक Normal तरीके से चलती रहती है, जब तक कि भाग देने वाले Variable यानी Loop को चलाने वाले Variable का मान 1 से ज्यादा रहता है। जैसे ही इस Variable का मान 0 हो जाता है, PHP संख्‍या में 0 का भाग देने की कोशिश करता है। परिणामस्वरूप एक Exception Trigger होता है।

यानी Exception की स्थिति तभी पैदा होती है जब संख्‍या में 0 का भाग देने की कोशिश की जाती है, अन्यथा Program Normal तरीके से काम करता है। इस प्रकार की विशेष स्थिति को ही PHP में Exception द्वारा Represent किया जाता है।

PHP में Exception को Handle करने के लिए हमें केवल इतना ही करना होता है कि हमारे PHP के जो Codes किसी तरह का Exception Generate कर सकते हैं, उन Codes को सामान्य Code की तरह लिखने के बजाय उन्हें एक Try Block में लिखा जाता है।

Try Block एक ऐसा Block होता है, जिसे PHP हमेंशा Exception Generate होने के लिए Monitor करता रहता है। यदि Try Block में किसी तरह का कोई Exception Trigger होता है, तो PHP उस Exception को Represent करता हुआ एक Exception Object Create करता है और उस Exception Object को try Block से Through कर देता है।

साथ ही try Block के जिस Statement पर Exception Trigger होता है, PHP उस Statement से आगे के Statements का Execution नहीं करता। बल्कि Exception Object के साथ try Block से Exit करता है।

try Block से आने वाले Exception Object को Handle करने के लिए catch Block बनाया जाता है। PHP Control tc try Block से किसी Exception Object के साथ Exit करता है, तो उस Exception Object के साथ वह catch Block में पहुंचता है, जहां try Block से Through होकर आने वाले Object की Information के आधार पर catch Block में उस Exception को Handle किया जाता है।

जब हम किसी Code को Monitor करने के लिए उसे try Block में लिखते हैं, तो किसी भी try Block के साथ कम से कम एक catch Block जरूर Associated रहता है।

चूंकि एक try Block एक से ज्यादा प्रकार के Exceptions Trigger कर सकता है, इसलिए हम एक try Block के साथ अलग-अलग प्रकार के Exceptions को Handle करने के लिए अलग-अलग प्रकार के catch Blocks को Specify कर सकते हैं।

Normal Execution के दौरान try Block के सभी Codes सामान्य Codes की तरह ही Execute होते हैं, लेकिन जब try Block में लिखे गए Codes में से कोई Code किसी तरह का Exception Trigger करता है, तो try Block उस Exception को Handle करने के लिए Matching catch Block खोजता है और उस Exception को Handle करता है। यदि Generate होने वाले Exception को Handle करने से संबंधित कोई भी catch Block न हो, तो PHP “Uncaught Exception …” Message के साथ Fatal Error Trigger करता है।

try Block से जो Exception Through किया जाता है, उस Exception का Exception Class अथवा Exception Class की किसी Sub-Class का Object होना जरूरी होता है। यदि हम किसी ऐसी Class का Exception Object Through करने की कोशिश करते हैं, जो कि वास्तव में Exception अथवा इसकी किसी Sub-Class का Object नहीं है, तो PHP Fatal Error Trigger करता है।

By Default रूप से PHP के सभी Internal Functions केवल Error Reporting करते हैं। Exception Handling की Capability केवल Object Oriented Execution के दौरान ही प्राप्त होती है। हालांकि हम किसी भी Internal Error Reporting को ErrorException Class का प्रयोग करके Exception में Convert कर सकते हैं। PHP में एक सामान्य Exception Handler का Syntax निम्नानुसार होता हैः

try{
	//Codes to be monitored;
}
catch(Exception){
	//Exception Handler
}

Exception वास्तव में PHP में एक Base Class है, जिसका Structure निम्नानुसार होता हैः

<?php
class Exception
{
    protected $message = 'Unknown exception';   		// exception message
    private   $string;                         			// __toString cache
    protected $code = 0;  					       // user defined exception code
    protected $file;           				       // source filename of exception
    protected $line;           				       // source line of exception
    private   $trace;           				       // backtrace
    private   $previous;                       			// previous exception if nested exception

    public function __construct($message = null, $code = 0, Exception $previous = null);

    final private function __clone();           		// Inhibits cloning of exceptions.

    final public  function getMessage();        		// message of exception
    final public  function getCode();           		// code of exception
    final public  function getFile();           			// source filename
    final public  function getLine();           		// source line
    final public  function getTrace();          		// an array of the backtrace()
    final public  function getPrevious();       		// previous exception
    final public  function getTraceAsString();  	// formatted string of trace

    /* Overrideable */
    public function __toString();               			// formatted string for display
}
?>

चूंकि PHP के सभी Exceptions को Represent करने के लिए Exception नाम की एक Base Class है, इसलिए इस Class को हम हमारी सुविधानुसार Extend करके अपने स्वयं के Exceptions Classes बना सकते हैं। लेकिन हम हमारी स्वयं की Exception Class बना सकें, इससे पहले हमें Base Exception Class व उसके द्वारा Provide की जाने वाली Functionalities को समझना जरूरी है।

PHP की Base Exception Class काफी Simple Class है जो हमें एक Default Constructor Provide करता है। इस Constructor में कोई Compulsory Parameter नहीं है लेकिन तीन Optional Parameters हैं जबकि इस Class में 6 Methods हैं।

Default Constructor

Default Constructor को हम बिना किसी तरह का Parameter Specify किए हुए Call कर सकते हैं। जब हम इस Class का नया Object Crete करते हैं और उसमें किसी तरह का कोई Parameter Specify नहीं करते, तब Default Constructor Execute होता है।

जब एक बार Exception Object Initialize हो जाता है, तब हम उस Object के लिए Base Class में Define किए गए 6 Methods को Use कर सकते हैं व Create होने वाले Exception Object के बारे में Detailed जानकारी प्राप्त कर सकते हैं। हम निम्न Statement द्वारा कभी भी Exception Class को Invoke कर सकते हैं:

      throw new Exception();

इस Exception Object के साथ हम केवल चार Methods को ही Use करते हैं। Base Class में Specify किए गए अन्य दो Exceptions केवल तब उपयोगी होते हैं, जब हम Class को Derive करते हैं।

Base Class के Constructor को Overload करके हम Exception से संबंधित Extra Ordinary Functionalities प्राप्त कर सकते हैं। इसके दो Optional Parameters निम्नानुसार होते हैं:

message

इस Parameter में Generate होने वाली Exception से संबंधित Explanation होता है, जिसे हम getMessage() Method का प्रयोग करके प्राप्त कर सकते हैं।

error code

PHP में हर Error को एक Code Number दिया गया है। Trigger होने वाले Exception के Error Code Number को जानने के लिए हम इस Parameter को Use कर सकते हैं। इस Parameter में कोई Specify Number Specify करके हम हमारे स्वयं के भी Error Code Define कर सकते हैं। Trigger होने वाले Exception के Error Code को जानने के लिए हम getCode() Method को Use कर सकते हैं। इस Constructor को हम निम्नानुसार कई तरीकों से Call कर सकते हैं:

throw new Exception(“Something bad just happened”, 4)
throw new Exception(“Something bad just happened”);
throw new Exception(“”, 4);

Methods

Exception Base Class हमें कुल 6 Methods Provide करता है जो निम्नानुसार हैं:

getMessage() Method

ये Method उस User Defined Exception Message को Return करता है, जिसे Constructor में Pass किया गया होता है। यदि Exception Object throw करते समय किसी Message को Specify न किया गया हो, तो ये Method कुछ भी Return नहीं करता।

getCode() Method

ये Method उस User Defined Exception Error Code को Return करता है, जिसे Constructor में Pass किया गया होता है। यदि Exception Object throw करते समय किसी Error Code को Specify न किया गया हो, तो ये Method कुछ भी Return नहीं करता।

getLine() Method

ये Method उस Line Number को Return करता है, जिसने Exception Trigger किया है।

getFile() Method

ये Method उस File के नाम को Return करता है, जिसमें Exception Object throw किया है।

getTrace() Method

ये Method एक Array Return करता है जिसमें उस Context की Information होती है, जिसमें Exception Trigger हुआ है। इस Array में Exception Trigger करने वाली File, Line, FunctionFunction Parameters की जानकारी होती है।

getTraceAsString() Method

ये Method getTrace() Method द्वारा Provide की जाने वाली सभी जानकारियों को एक Array के रूप में नहीं बल्कि एक String के रूप में Return करता है।

हालांकि हम हमारी जरूरत के अनुसार Base Exception Class को Extend यानी Inherit करके अपनी अलग-अलग प्रकार की जरूरत से संबंधित स्वयं की User Defined Sub-Exception Class Create कर सकते हैं, लेकिन हम उपरोक्त 6 Methods में से किसी को भी Override नहीं कर सकते, क्योंकि इन सभी Methods को Base Class में final Declare किया गया है।

PHP स्वयं तो विभिन्न प्रकार की Errors के लिए विभिन्न प्रकार के Error Message व Exceptions Generate करता ही है, लेकिन जब हम हमारे स्वयं के Codes लिखते हैं, तो Trigger हो सकने वाली विभिन्न प्रकार की Errors व Exceptions को हम स्वयं भी try Block में Specify करते हैं और catch Block में उन्हें Handle करते हैं।

सामान्यतः User Defined Exception Objects Create करने व उन्हें Handle करने की ये प्रक्रिया PHP में बहुत ज्यादा Use की जाती है। इसलिए हम इन्हीं के बारे में विस्तार से समझने की कोशिश करते हैं। हम किस तरह से हमारी जरूरत के अनुसार स्वयं के Exception Objects Create कर सकते हैं और Trigger होने वाली Exceptions को Handle कर सकते हैं, इस बात को निम्न Program द्वारा बेहतर तरीके से समझा जा सकता हैः

<?php
	try {
		$fh = fopen("contacts.txt", "r");
		
		if (! $fh) {
			throw new Exception("Could not open the file!");
		}
	}
	catch (Exception $e) {
		echo "Error (File: ". $e->getFile().", line ".
		$e->getLine()."): ". $e->getMessage();
	}
?>

//Output
Warning: fopen(contacts.txt): failed to open stream: No such file or directory in C:\wamp\www\phpInHindi\001.php on line 3
Error (File: C:\wamp\www\phpInHindi\001.php, line 6): Could not open the file!

जब हम इस Program को Run करते हैं, तो हमें Output के अनुसार Warning Message Display होता है। ऐसा इसलिए होता है क्योंकि इस Program में हम contats.txt नाम की एक ऐसी File को Open करने की कोशिश कर रहे हैं, जो कि Available ही नहीं है।

चूंकि ऐसा कभी भी हो सकता है कि PHP द्वारा हम किसी ऐसी File को Open करने की कोशिश करें, जो कि Available ही न हो और जब हम किसी ऐसी File को Open करने की कोशिश करेंगे, तो PHP Error ही Trigger करेगा।

इसलिए PHP में जिस किसी भी Code द्वारा Error Trigger होने की सम्भावना होती है, उसे try Block में लिखा जाता है तथा यदि try Block में लिखा गया Code किसी तरह का Error Trigger करता है, तो उस Error को Handle करने के लिए हमें catch Block लिखना होता है, जो कि हमने इस Program में किया है।

इस Program में हमने सबसे पहले try Block Create किया है और उस try Block में निम्न Statement द्वारा contacts.txt नाम की File को Reading Mode में Open करने के लिए fopen() Function को Use किया हैः

$fh = fopen(“contacts.txt”, “r”);

यदि Disk पर File Available होती है, तो fopen() Function File को Open करके उस File का Reference या Handle $fh को Assign कर देता है। जबकि File को ठीक से Open न कर सकने की स्थिति में ये Function False Return करता है।

चूंकि हम जिस File को Open करना चाहते हैं, वह File Available ही नहीं है, इसलिए ये Function false Return करता है, जिसे हम if Statement में NOT Operator का प्रयोग करते हुए Check करते हैं।

चूंकि File Disk पर Available नहीं है, इसलिए if Statement में Not Operator का प्रयोग करने की वजह से $fh में Stored False मान True में Convert हो जाता है व PHP Control if Condition Statement Block में Enter करके एक Anonymous Exception Object Create करता है।

Exception Object Create करते समय Exception Class का Constructor Execute होता है और पहले Argument में Message के रूप में उसमें “Could not open the file!” String को Assign कर दिया जाता है। अन्त में PHP द्वारा इस नए Create होने वाले Anonymous Exception Object को throw Keyword का प्रयोग करके Throw किया जाता है।

try Block में Trigger होने वाली Exception को Handle करने के लिए से Throw होने वाले Exception Object को try Block के साथ Associated catch Block में Catch किया जाता है।

जब PHP Control try Block से catch Block में Enter होता है तो वह try Block से Throw होने वाले Newly Created Anonymous Exception Object को catch Block के Exception Type के Object $e में Catch करता है।

यानी try Block से throw होने वाले Exception Object की सारी Information catch Block के Exception Object $e में Copy हो जाती हैं।

	catch (Exception $e) {
		echo "Error (File: ". $e->getFile().", line ".
		$e->getLine()."): ". $e->getMessage();
	}

अब PHP Control इस catch Block में Enter करता है और try Block से आने वाले Exception Object की Information को Display करता है।

$e->getFile() Statement Exception Trigger करने वाली File का नाम Display करता है जबकि $e->getMessage() Statement try Blok से आने वाले Exception Object के उस Message को Display करता है, जिसे हमने try Block में Anonymous Exception Object Create करते समय Error Message के रूप में Specify किया था।

PHP में हर User Defined Exception को इसी तरह से try Block से throwcatch Block में Catch करके Handle किया जाता है।

User Defined Exception Class

PHP हमें हमारी स्वयं की User Defined Exception Classes Create करने की भी सुविधा देता है। यानी हम हमारी जरूरत के अनुसार अपने स्वयं की Exception Classes Create कर सकते हैं और try Block में अपनी स्वयं की Exception Classes के Objects throw कर सकते हैं। इस काम को करने के लिए हमें PHP की Base Exception Class को User Defined Exception Class में Extend करना होता है।

जब हम Base Exception Class को User Defined Exception Class में Extend करते हैं, तो हम हमारी User Defined Exception Class में ज्यादा बेहतर तरीके से Exceptions को Define व Manage कर सकते हैं।

Multiple catch Block

ऐसा जरूरी नहीं है कि कोई try Block केवल एक ही प्रकार का Exception Trigger करेगा। एक try Block में हम विभिन्न प्रकार के Codes लिख सकते हैं और विभिन्न प्रकार के Codes विभिन्न प्रकार के Exceptions Trigger कर सकते हैं।

इसलिए सामान्यतः विभिन्न प्रकार के Exceptions को Handle करने के लिए हम एक ही try Block के साथ एक से ज्यादा catch Blocks को अलग-अलग प्रकार के Exceptions को Handle करने के लिए Associate कर सकते हैं।

अलग-अलग प्रकार के Exceptions को Handle करने के लिए हम अलग-अलग प्रकार की Exceptions की Sub-Classes Create कर सकते हैं और अलग-अलग प्रकार के Exceptions को Handel करने के लिए अलग-अलग प्रकार की Exception Sub-Classes Create करने हेतु हमें Base Exception Class को Extend करना होता है। जैसेः

<?php
	class NumericalException extends Exception{ }
	class StringException extends Exception{ }
	class MyException extends Exception{ }
		
	try {
		throw new NumericalException("This is from Numerical Exception.");
		
		StringError:
		throw new StringException("This is from String Exception.");
		
		MyError:
		throw new MyException("This is from My Exception.");
	}
	catch (NumericalException $e) {
		echo "\n Error " . $e->getLine(). ':' .$e->getMessage();
		goto StringError;
	}
	catch (StringException $e) {
		echo "\n Error " . $e->getLine(). ':' .$e->getMessage();
		goto MyError;
	}
	catch (Exception $e) {
		echo "\n Error " . $e->getLine(). ':' .$e->getMessage();
	}
?>

// Output
   Error 17:This is from Numerical Exception.
   Error 20:This is from String Exception.
   Error 23:This is from My Exception.

इस Program में हमने NumericException, StringExceptionMyException नाम की तीन Sub-Exception Classes को Base Exception Classes से Inherit किया है।

चूंकि जब try Block में Exception Trigger होता है, तो PHP Parser उसी Line से try Block से Exit हो जाता है, जहां पर Exception Trigger हुआ है। परिणामस्वरूप try Block के अन्य Statements का Execution नहीं होता। जबकि हमें हमारे इस Program में तीन Exceptions को Trigger करना है।

इसलिए हमने हमारे इस Program में goto Statement का प्रयोग करके PHP Control को फिर से दूसरे फिर से catch Block से try Block में Particular Label पर Transfer किया है, ताकि PHP try Block के goto Label से Associated Codes को भी Execute कर सके।

चूंकि इस Program में हम एक ही try Block से तीन Exception Object throw करना चाहते हैं, इसलिए हमने इस try Block में तीन प्रकार के Exceptions को throw करने के लिए तीन प्रकार के Exceptions को Sub-Class के रूप में Base Exception Class से Derive किया है। हालांकि तीनों ही Sub-Exception Classes में हमने कोई Code नहीं लिखा है, लेकिन हम हमारी जरूरत के अनुसार इन तीनों ही Classes में नए Codes लिख सकते हैं।

जब सबसे पहले ये Program Run होता है और try Block में पहुंचता है, तो पहली ही Line में NumericalException Type का एक Object throw होता है, जिसे उस catch Block में Catch किया जाता है, जो NumericalException Type के Object को Argument के रूप में Accept करता है।

इस Catch Block में आने वाले NumericalException Object के Message को Print किया जाता है और अगले goto Statement द्वारा PHP Control फिर से try Block के StringException वाले Statement पर पहुंच जाता है।

यहां पर StringException Type का एक Object throw होता है, जिसे उस catch Block में Catch किया जाता है जो Argument के रूप में StringException Type के Object को Accept करता है।

फिर से इस Catch Block में आने वाले StringException Object के Message को Print किया जाता है और अगले goto Statement द्वारा PHP Control फिर से try Block के MyException वाले Statement पर पहुंच जाता है।

यहां पर MyException Type का एक Object throw होता है, जिसे ब्ंजबी करने के लिए हमने कोई ऐसा बंजबी ठसवबा नहीं लिखा है, जो Argument के रूप में MyException Type के Object को Accept करे।

परिणामस्वरूप PHP का Default Exception Handler Execute होता है और वो catch Block Execute होता है, जिसमें Argument के रूप में Base Exception Class का Object Accept किया जाता है।

यानी जब किसी Exception Object को Catch करने के लिए कोई भी catch Block नहीं होता है, तब Default रूप से PHP का Default Exception Object उस Exception को Accept करता है। ऐसा इसलिए होता है क्योंकि किसी भी अन्य Object Oriented Programming Language की तरह ही PHP में भी Base Class का Object अपने किसी भी Derived Class के Object के Reference को Hold व Access कर सकता है।

इस तरह से इस Program द्वारा हम Exception Class को Extend करने व Multiple catch Block को उपयोग में लेने के बारे में PHP की Exception Handling की Working को समझ सकते हैं।

किसी भी सामान्य PHP Statement की तरह हम try Block की भी Nesting कर सकते हैं। जब हम किसी try Block की Nesting करते हैं और Inner try Block कोई Exception Trigger करता है, तो उससे Associated Inner catch Block उस Exception को Handle करता है।

लेकिन यदि Inner try Block से Triggered Exception को Inner catch Block Handle करने में सक्षम न हो, तो फिर Outer try Block से Associated catch Block उस Inner try Block से Generated Exceptions को Handle करते हैं।

यदि Outer catch Block भी किसी Inner या Outer try Block से Generated Exception को Handle करने में सक्षम न हो, तो PHP स्वयं उस Exception को Handle करता है और सामान्यतः Fatal Error Trigger करता है।

किसी Nested try – catch Block का Syntax निम्नानुसार हो सकता हैः

<?php
	
	try {
		try {
			throw new Exception("Inner Exception.");
		}
		catch(InnerException $e){
			//Inner Exception Handler
		}
		catch(OtherException $e){
			//Other Inner Exception Handler
		}
		
		throw new Exception("Outer Exception.");
	}
	catch (OuterException $e) {
		//Outer Exception Handler
	}
	catch (Exception $e) {
		//Default Exception Handler for Inner and Outer try Block
	}
?>

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

PHP in Hindi | Page: 647 | Format: PDF

BUY NOW GET DEMO REVIEWS