फीचैप एक्सेप्शन हैंडलिंग

असामान्यता (Exception) का उपयोग निर्दिष्ट त्रुटि के दौरान स्क्रिप्ट के सामान्य अनुसूची को बदलने के लिए किया जाता है。

क्या असामान्यता है?

PHP 5 एक नया ओआई बेस्ड एरर हैंडलिंग विधि प्रदान करता है。

असामान्यता हैंडलिंग विधि का उपयोग तब किया जाता है जब निर्दिष्ट त्रुटि (असामान्यता) की स्थिति में आता है। इसे असामान्यता कहा जाता है。

जब असामान्यता ट्रिगर होती है, तो आमतौर पर इस तरह होता है:

  • वर्तमान कोड स्टेट बचाया गया है
  • कोड कार्यान्वयन पहले से परिभाषित असामान्यता हैंडलर फ़ंक्शन को स्थानांतरित कर दिया गया है
  • स्थिति के अनुसार, हैंडलर शोधी बचे कोड स्टेट से फिर से कोड को चलाने की कोशिश कर सकता है, स्क्रिप्ट को अंत कर सकता है या स्क्रिप्ट को अन्य स्थान से जारी रख सकता है

हम विभिन्न त्रुटि हैंडलिंग विधियों को दिखाएंगे:

  • असामान्यता का बेसिक उपयोग
  • स्वयंभू असामान्यता हैंडलर बनाना
  • अनेक रोकावटें
  • रोकावट फिर से फेंकना
  • शीर्ष असामान्यता हैंडलर सेट करना

असामान्यता का बेसिक उपयोग

जब असामान्यता फेंकी जाती है, तो उसके बाद का कोड जारी नहीं रहेगा। PHP एक मेल खोजने के लिए प्रयास करेगा "catch" कोड ब्लॉक。

अगर असामान्यता को पकड़ा नहीं गया है और set_exception_handler() के द्वारा कोई उचित एडवांस नहीं किया गया है, तो एक गंभीर त्रुटि होगी (फ़ैटल एरर) और "Uncaught Exception" (न कड़ी असामान्यता) त्रुटि संदेश आउटपुट होगा。

हम एक असामान्यता फेंकने और उसे पकड़ने के लिए प्रयास करेंगे:

<?php
// असामान्यता वाली फ़ंक्शन बनाएं
function checkNum($number)
 {
 if($number>1)
  {
  throw new Exception("Value must be 1 or below");
  }
 return true;
 }
// असामान्यता ट्रिगर करें
checkNum(2);
?>

इस तरह की त्रुटि प्राप्त होगी:

फ़ैटल एरर: अपकट 'Exception' अपकट 
संदेश 'मूल्य 1 या नीचे से होना चाहिए' में C:\webfolder\test.php:6 
स्टैक ट्रेस: #0 C:\webfolder\test.php(12): 
checkNum(28) #1 {मुख्य} C:\webfolder\test.php पर लाइन 6 पर फेंका गया

Try, throw और catch

उपरोक्त उदाहरण में दिखाई देने वाले त्रुटि से बचने के लिए, हमें असामान्यता को हाल्ट करने के लिए उचित कोड को बनाना चाहिए。

सही एडवांस को शामिल होना चाहिए:

  1. कोशिश करें - असामान्य फ़ंक्शन को "ट्राय" कोड ब्लॉक के अंदर स्थापित करना चाहिए। अगर कोई असामान्यता नहीं होती है, तो कोड अभी भी सामान्य तरीके से जारी रहेगा। लेकिन अगर असामान्यता ट्रिगर होती है, तो एक असामान्यता फ्लॉप होगी।
  2. Throw - Here it is specified how to trigger an exception. Every 'throw' must be matched with at least one 'catch'
  3. Catch - "catch" code block will catch the exception and create an object containing exception information

Let's trigger an exception:

<?php
//Create a function that can throw an exception
function checkNum($number)
 {
 if($number>1)
  {
  throw new Exception("Value must be 1 or below");
  }
 return true;
 }
//In the 'try' block, trigger an exception
try
 {
 checkNum(2);
 //If the exception is thrown, this text will not be shown
 echo 'If you see this, the number is 1 or below';
 }
//अनुपात पकड़ना
catch(Exception $e)
 {
 echo 'Message: ' .$e->getMessage();
 }
?>

ऊपरी कोड इस तरह की गलती प्राप्त करेगा:

संदेश: वैल्यू 1 या नीचे होना चाहिए

उदाहरण व्याख्या:

ऊपरी कोड एक अनुपात को फ़ेला देता है और उसे पकड़ता है:

  1. checkNum() फ़ंक्शन को बनाना। यह नंबर 1 से बड़ा है क्या नहीं है। अगर होता है, तो एक अनुपात को फ़ेला देता है。
  2. इस "try" कोड ब्लॉक में checkNum() फ़ंक्शन को कॉल किया जाता है
  3. checkNum() फ़ंक्शन में एक अनुपात को फ़ेला जाता है
  4. "catch" कोड ब्लॉक इस एक्सेप्शन को प्राप्त करता है और एक एक्सेप्शन के सूचनाओं को रखने वाला एक ऑब्जेक्ट ($e) बनाता है
  5. इस एक्सेप्शन ऑब्जेक्ट से $e->getMessage() को कॉल करके, इस एक्सेप्शन के गलती संदेश को आउटपुट करते हैं

फिर भी, 'हर throw को एक catch साथ' के सिद्धांत का पालन करने के लिए, एक शीर्ष एक्सेप्शन हैंडलर सेट कर सकते हैं जो लापता गलतियों को संभाले।

अनुकूलित Exception क्लास बनाना

अनुकूलित एक्सेप्शन हैंडलर बनाना बहुत ही सरल है। हमें एक विशेष क्लास बनानी है, जो PHP में अनुपात के समय फ़ंक्शन फ़ेला सके। यह क्लास एक्सेप्शन क्लास का एक विस्तार होना चाहिए。

यह अनुकूलित एक्सेप्शन वर्ग PHP के एक्सेप्शन वर्ग के सभी गुणों को आगे ले जाता है, आप इसमें अनुकूलित फ़ंक्शन जोड़ सकते हैं。

हम एक्सेप्शन वर्ग को बनाना शुरू करते हैं:

<?php
class customException extends Exception
 {
 public function errorMessage()
  {
  //त्रुटि संदेश
  $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile();
  : <b>'.$this->getMessage().'</b> एक वैध E-Mail पता नहीं है;
  return $errorMsg;
  }
 }
$email = "someone@example...com";
try
 {
 // जाँच करें 
 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
  {
  //ईमेल अवैध होने पर असामान्यता फेंकें
  throw new customException($email);
  }
 }
catch (customException $e)
 {
 //अनुकूल संदेश दिखाएं
 echo $e->errorMessage();
 }
?>

यह नया वर्ग पुराने exception वर्ग की प्रतिकृति है, errorMessage() फ़ंक्शन सहित। इसके कारण यह पुराने वर्ग की प्रतिकृति है, इसके द्वारा इसके अभिन्न गुणों और तरीकों को विरासत में लेता है, जैसे कि exception वर्ग के तरीकों को उपयोग कर सकते हैं, जैसे getLine() , getFile() और getMessage()।

उदाहरण व्याख्या:

ऊपरी कोड एक रोकावट फेंकता है और उसे एक स्वयंगत exception वर्ग के द्वारा पकड़ता है:

  1. customException() क्लास एक पुरानी exception क्लास के विस्तार के रूप में बनाई गई है। इस तरह यह पुरानी क्लास की सभी गुण और विधियाँ विरासत करती है。
  2. errorMessage() फ़ंक्शन को बनाएं। e-mail पता अवैध होने के कारण इस फ़ंक्शन द्वारा एक त्रुटि संदेश बटाया जाएगा
  3. $email वेरियेबल को अवैध e-mail पता शब्दरूप में सेट करें
  4. एक 'try' कोड ब्लॉक को चलाया जाता है, e-mail पता अवैध होने के कारण एक रोकावट फेंकता है
  5. एक 'catch' कोड ब्लॉक रोकावट को पकड़ता है और त्रुटि संदेश दिखाता है

अनेक रोकावटें

एक स्क्रिप्ट के लिए अनेक रोकावटों को उपयोग कर सकते हैं, ताकि अनेक कार्यकलापों की जाँच की जा सके。

अनेक if..else कोड ब्लॉकों, एक switch कोड ब्लॉक या अनेक रोकावटों को निकटीकरण कर सकते हैं। ये रोकावटें अलग अलग exception वर्गों का उपयोग करके अलग त्रुटि संदेश बटायें और दिखायें:

<?php
class customException extends Exception
{
public function errorMessage()
{
//त्रुटि संदेश
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile();
: <b>'.$this->getMessage().'</b> एक वैध E-Mail पता नहीं है;
return $errorMsg;
}
}
$email = "someone@example.com";
try
 {
 // जाँच करें 
 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
  {
  //ईमेल अवैध होने पर असामान्यता फेंकें
  throw new customException($email);
  }
 //"example" ईमेल पते में जाँच करें
 if(strpos($email, "example") !== FALSE)
  {
  throw new Exception("$email is an example e-mail");
  }
 }
catch (customException $e)
 {
 echo $e->errorMessage();
 }
catch(Exception $e)
 {
 echo $e->getMessage();
 }
?>

उदाहरण व्याख्या:

ऊपरी कोड दो शर्तों को टेस्ट करता है, यदि कोई भी शर्त सही नहीं है, तो एक रोकावट फेंकता है:

  1. customException() क्लास एक पुरानी exception क्लास के विस्तार के रूप में बनाई गई है। इस तरह यह पुरानी क्लास की सभी गुण और विधियाँ विरासत करती है。
  2. errorMessage() फ़ंक्शन को बनाया गया है। यदि ईमेल पता अवैध है, तो इस फ़ंक्शन एक त्रुटि संदेश वापस करता है。
  3. एक 'try' कोड ब्लॉक को चलाया जाता है, पहले शर्त में रोकावट नहीं फेंकता है
  4. e-mail में 'example' शब्द होने के कारण दूसरा शर्त रोकावट को ट्रिगर करेगा。
  5. एक 'catch' कोड ब्लॉक रोकावट को पकड़ता है और उचित त्रुटि संदेश दिखाता है

यदि customException को पकड़ा नहीं गया है और केवल base exception को पकड़ा गया है, तो वहाँ रोकावट को संभाला जाएगा。

रोकावट फिर से फेंकना

कभी, जब असामान्य रोकावट फेंकी जाती है, आप इसे मानक तरीके से अलग तरीके से संभालना चाह सकते हैं। एक 'catch' कोड ब्लॉक में फिर से रोकावट फेंक सकते हैं।

स्क्रिप्ट को उपयोगकर्ता को प्रणाली त्रुटि को छुपाना चाहिए। प्रोग्रामर के लिए प्रणाली त्रुटियाँ महत्वपूर्ण हो सकती हैं, लेकिन उपयोगकर्ता उनसे दिलचस्पी नहीं रखते। उपयोगकर्ता को आसानी से इस्तेमाल करने के लिए, आप फिर से उपयोगकर्ता के लिए अधिक अनुकूल संदेश वाली असामान्यता फेंक सकते हैं:

<?php
class customException extends Exception
 {
 public function errorMessage()
  {
  //त्रुटि संदेश
  $errorMsg = $this->getMessage().' is not a valid E-Mail address.';
  return $errorMsg;
  }
 }
$email = "someone@example.com";
try
 {
 try
  {
  //"example" ईमेल पते में जाँच करें
  if(strpos($email, "example") !== FALSE)
   {
   //ईमेल अवैध होने पर असामान्यता फेंकें
   throw new Exception($email);
   }
  }
 catch(Exception $e)
  {
  //असामान्यता फिर से फेंकें
  throw new customException($email);
  }
 }
catch (customException $e)
 {
 //अनुकूल संदेश दिखाएं
 echo $e->errorMessage();
 }
?>

उदाहरण व्याख्या:

ऊपरी कोड ईमेल पते में "example" शब्द के होने की जाँच करता है। यदि हो, तो फिर से असामान्यता फेंकता है:

  1. customException() क्लास एक पुरानी exception क्लास के विस्तार के रूप में बनाई गई है। इस तरह यह पुरानी क्लास की सभी गुण और विधियाँ विरासत करती है。
  2. errorMessage() फ़ंक्शन को बनाया गया है। यदि ईमेल पता अवैध है, तो इस फ़ंक्शन एक त्रुटि संदेश वापस करता है。
  3. $email वेरियेबल को एक वैध ईमेल पता के रूप में सेट किया गया है, लेकिन इसमें "example" शब्द है。
  4. "try" कोड ब्लॉक में एक और "try" कोड ब्लॉक है, इस तरह फिर से असामान्यता फेंकी जा सकती है。
  5. e-mail में "example" शब्द शामिल होने के कारण असामान्यता ट्रिगर होती है。
  6. "catch" इस असामान्यता को पकड़ता है और फिर से "customException" फेंकता है。
  7. एक "customException" पकड़ा गया है और एक त्रुटि संदेश दिखाया गया है。

यदि इसके मौजूदा "try" भाग में अनुपात नहीं पकड़ा गया है, तो इसे उच्च स्तर पर catch भाग में खोजना होगा।

शीर्ष स्तर अनुपात प्रशासक सेट करना

set_exception_handler() फ़ंक्शन सभी अनपकड़े अनुपात को प्रशासन करने के लिए उपयोग की जाने वाली उपयुक्त फ़ंक्शन सेट करता है。

<?php
function myException($exception)
{
echo "<b>Exception:</b> " , $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred');
?>

उपरोक्त कोड का आउटपुट इस तरह होना चाहिए:

Exception: Uncaught Exception occurred

उपरोक्त कोड में "catch" भाग नहीं है, वरन् शीर्ष स्तर के अनुपात प्रशासक को ट्रिगर किया जाता है। सभी अगले अनुपात को पकड़ने के लिए इस फ़ंक्शन का इस्तेमाल करना चाहिए。

अनुपात के नियम

  • अनुपात प्रशासन करने वाले कोड को try भाग के भीतर रखना चाहिए, ताकि गुंजाइशी अनुपात पकड़ा जा सके。
  • हर try या throw भाग को कम से कम एक समकक्ष catch भाग होना चाहिए。
  • विभिन्न प्रकार के अनुपात को पकड़ने के लिए कई catch भागों का इस्तेमाल किया जा सकता है。
  • try भाग के भीतर catch भाग में फिर से अनुपात फेंसा दिया जा सकता है (re-thrown)。

संक्षेप में: अगर अनुपात फेंसा है, तो इसे पकड़ना चाहिए。