PHP ट्राई कैच उदाहरण: अपवाद और त्रुटि प्रबंधन ट्यूटोरियल
⚡ स्मार्ट सारांश
PHP में त्रुटि प्रबंधन और अपवाद अनुप्रयोगों को स्थिर और सुरक्षित बनाए रखते हैं, क्योंकि ये त्रुटियों को सीधे प्रदर्शित करने के बजाय अप्रत्याशित स्थितियों को प्रबंधित करते हैं। यह विस्तृत विवरण त्रुटियों और अपवादों के बीच अंतर, डाई स्टेटमेंट, कस्टम त्रुटि हैंडलर, त्रुटि रिपोर्टिंग स्तर और ट्राई, थ्रो और कैच अपवाद मॉडल को कई प्रकार के अपवादों के साथ समझाता है।
एक अपवाद क्या है?
त्रुटि एक अप्रत्याशित प्रोग्राम परिणाम है जिसे प्रोग्राम द्वारा स्वयं नियंत्रित नहीं किया जा सकता।
प्रोग्राम को ठीक करके त्रुटियों का समाधान किया जाता है। त्रुटि का एक उदाहरण एक अनंत लूप होगा जो कभी भी निष्पादित होना बंद नहीं करता है।
एक्सेप्शन एक अप्रत्याशित प्रोग्राम परिणाम है जिसे प्रोग्राम स्वयं संभाल सकता है।
अपवाद के उदाहरणों में ऐसी फ़ाइल को खोलने का प्रयास करना शामिल है जो मौजूद नहीं है।
इस अपवाद को या तो फ़ाइल बनाकर या उपयोगकर्ता को फ़ाइल खोजने का विकल्प प्रस्तुत करके नियंत्रित किया जा सकता है।
अपवादों को क्यों संभालना चाहिए?
- हमारे पेजों पर अप्रत्याशित परिणाम आने से बचें, जो हमारे उपयोगकर्ताओं के लिए बहुत कष्टदायक या परेशान करने वाले हो सकते हैं।
- दुर्भावनापूर्ण उपयोगकर्ताओं द्वारा हमारे अनुप्रयोगों पर हमला करने के लिए उपयोग की जाने वाली जानकारी को उजागर न करके हमारे अनुप्रयोगों की सुरक्षा में सुधार करें
- किसी भी संभावित त्रुटि होने पर प्रोग्राम के सामान्य प्रवाह को बदलने के लिए PHP अपवादों का उपयोग किया जाता है।
PHP त्रुटि प्रबंधन
जब कोई त्रुटि उत्पन्न होती है, तो आपकी कॉन्फ़िगरेशन सेटिंग्स के आधार पर, PHP वेब ब्राउज़र में हुई त्रुटि से संबंधित जानकारी के साथ त्रुटि संदेश प्रदर्शित करता है।
PHP त्रुटियों को संभालने के कई तरीके प्रदान करता है। हम तीन आमतौर पर इस्तेमाल किए जाने वाले तरीकों पर नज़र डालेंगे:
- डाई कथन – die फ़ंक्शन echo और exit फ़ंक्शन को एक साथ जोड़ता है। यह तब बहुत उपयोगी होता है जब हम कोई त्रुटि होने पर संदेश आउटपुट करना चाहते हैं और स्क्रिप्ट का निष्पादन रोकना चाहते हैं।
- कस्टम त्रुटि हैंडलर - ये उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन हैं जिन्हें त्रुटि होने पर बुलाया जाता है।
- PHP त्रुटि रिपोर्टिंग त्रुटि संदेश आपके PHP त्रुटि रिपोर्टिंग सेटिंग्स पर निर्भर करता है। यह विधि विकास परिवेश में तब बहुत उपयोगी होती है जब आपको त्रुटि के कारण का पता न हो। प्रदर्शित जानकारी आपके एप्लिकेशन को डीबग करने में मदद कर सकती है।
त्रुटि प्रबंधन के उदाहरण
आइए अब त्रुटि प्रबंधन प्रक्रियाओं के साथ कुछ सरल उदाहरण देखें।
मान लीजिए कि हमारे पास एक ऐसी गणना है जो किसी संख्या को शून्य से विभाजित कर सकती है। हम चाहते हैं कि PHP द्वारा त्रुटि प्रदर्शित करने के बजाय इस स्थिति को स्पष्ट रूप से हल किया जाए।
नीचे दिया गया कोड उपरोक्त उदाहरण को कार्यान्वित करता है।
<?php
$denominator = 0;
echo 2 / $denominator;
?>
मान लीजिए कि आपने simple_error.php फ़ाइल को phptuts फ़ोल्डर में सहेजा है, तो इसे खोलें। URL http://localhost/phptuts/simple_error.php
आपको निम्नलिखित परिणाम मिलेंगे।
जैसा कि आप उपरोक्त परिणामों से देख सकते हैं, इससे हमारा एप्लिकेशन अव्यवसायिक लगता है और उपयोगकर्ता को परेशानी हो सकती है।
हम उपरोक्त कोड को संशोधित करेंगे और एप्लिकेशन के लिए एक एरर हैंडलर लिखेंगे।
<?php $denominator = 0; if ($denominator != 0) { echo 2 / $denominator; } else { echo "cannot divide by zero (0)"; } ?>
मान लीजिए कि आपने उपरोक्त कोड को error_handling.php के रूप में सहेजा है, तो इसे खोलें। URL http://localhost/phptuts/error_handling.php
नोट: "फ़ाइल नहीं मिली" जैसे सीधे संदेश को प्रदर्शित करने के बजाय ऊपर दिखाए गए संदेश जैसा संदेश प्रदर्शित करना एक अच्छा सुरक्षा अभ्यास है।
आइए एक और उदाहरण देखें जिसमें कस्टम एरर हैंडलर का उपयोग किया गया है।
कस्टम त्रुटि हैंडलर को डिफ़ॉल्ट PHP त्रुटि हैंडलिंग फ़ंक्शन के रूप में सेट किया जाएगा और यह मूल रूप से एक त्रुटि संख्या और संदेश प्रदर्शित करेगा।
नीचे दिया गया कोड उपरोक्त उदाहरण के कार्यान्वयन को दर्शाता है।
<?php function my_error_handler($error_no, $error_msg) { echo "Oops, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
ओपन URL http://localhost/phptuts/custom_error_handler.phpआपको निम्नलिखित परिणाम प्राप्त होंगे।
जैसा कि आप ऊपर दिए गए उदाहरण से देख सकते हैं, कस्टम एरर हैंडलर इस मायने में शक्तिशाली होते हैं कि:
- वे हमें त्रुटि संदेशों को अनुकूलित करने की अनुमति देते हैं।
- कस्टम एरर हैंडलर में किसी फाइल या डेटाबेस में एरर लॉगिंग, डेवलपर को ईमेल भेजना और इसी तरह की अन्य कार्रवाइयां भी शामिल हो सकती हैं।
अब हम त्रुटि प्रबंधन के तीसरे प्रकार को देखते हैं। हम PHP के अंतर्निहित error_reporting फ़ंक्शन का उपयोग करेंगे। इसका मूल सिंटैक्स इस प्रकार है।
<?php error_reporting($reporting_level); ?>
यहाँ,
- “error_reporting” PHP त्रुटि रिपोर्टिंग फ़ंक्शन है
- “$reporting_level” वैकल्पिक है और इसका उपयोग रिपोर्टिंग स्तर निर्धारित करने के लिए किया जा सकता है। यदि कोई रिपोर्टिंग स्तर निर्दिष्ट नहीं किया गया है, तो PHP डिफ़ॉल्ट त्रुटि रिपोर्टिंग स्तर का उपयोग करेगा जैसा कि php.ini फ़ाइल में निर्दिष्ट है।
| रिपोर्टिंग स्तर | विवरण | उदाहरण |
|---|---|---|
| ई_चेतावनी | केवल चेतावनी संदेश प्रदर्शित करता है। स्क्रिप्ट के निष्पादन को नहीं रोकता | त्रुटि_रिपोर्टिंग(E_WARNING); |
| E_NOTICE | यह प्रोग्राम के सामान्य निष्पादन के दौरान आने वाली सूचनाएं प्रदर्शित करता है या यह कोई त्रुटि भी हो सकती है। | त्रुटि रिपोर्टिंग (ई_नोटिस); |
| E_उपयोगकर्ता_त्रुटि | उपयोगकर्ता द्वारा उत्पन्न त्रुटियों को प्रदर्शित करता है, अर्थात् एक कस्टम त्रुटि हैंडलर | त्रुटि रिपोर्टिंग (ई_यूजर_त्रुटि); |
| E_उपयोगकर्ता_चेतावनी | उपयोगकर्ता द्वारा उत्पन्न चेतावनी संदेश प्रदर्शित करता है | त्रुटि_रिपोर्टिंग(E_USER_WARNING); |
| E_USER_NOTICE | उपयोगकर्ता द्वारा उत्पन्न सूचनाएँ प्रदर्शित करता है | त्रुटि_रिपोर्टिंग(E_USER_NOTICE); |
| E_पुनर्प्राप्तियोग्य_त्रुटि | उन त्रुटियों को प्रदर्शित करता है जो गंभीर नहीं हैं और जिन्हें कस्टम त्रुटि हैंडलर का उपयोग करके संभाला जा सकता है। | त्रुटि_रिपोर्टिंग(E_RECOVERABLE_ERROR); |
| ई_सभी | सभी त्रुटियाँ और चेतावनियाँ प्रदर्शित करता है | त्रुटि_रिपोर्टिंग(E_ALL); |
त्रुटियाँ और अपवाद के बीच अंतर
- अपवाद उत्पन्न होते हैं और उन्हें पकड़ने का प्रयास किया जाता है, जबकि त्रुटियां आम तौर पर अपूरणीय होती हैं।
- अपवादों को ऑब्जेक्ट ओरिएंटेड तरीके से संभाला जाता है। इसका मतलब यह है कि जब कोई अपवाद उत्पन्न होता है, तो एक अपवाद ऑब्जेक्ट बनाया जाता है जिसमें अपवाद का विवरण होता है।
नीचे दी गई तालिका में एक्सेप्शन ऑब्जेक्ट के मेथड दिखाए गए हैं।
| विधि | विवरण | उदाहरण |
|---|---|---|
| संदेश प्राप्त करें() | अपवाद का संदेश प्रदर्शित करता है |
<?php
echo $e->getMessage();
?>
|
| मिलCode() | अपवाद को दर्शाने वाला संख्यात्मक कोड प्रदर्शित करता है |
<?php
echo $e->getCode();
?>
|
| फ़ाइल प्राप्त करें() | फ़ाइल का नाम और पथ प्रदर्शित करता है जहाँ अपवाद उत्पन्न हुआ |
<?php
echo $e->getFile();
?>
|
| लाइन में आओ() | वह पंक्ति संख्या प्रदर्शित करता है जहां अपवाद उत्पन्न हुआ |
<?php
echo $e->getLine();
?>
|
| मिलTracइ() | बैक का एक ऐरे प्रदर्शित करता हैtracअपवाद से पहले ई |
<?php print_r( $e->getTrace()); ?> |
| getPrevious() | वर्तमान अपवाद से पहले पिछले अपवाद को प्रदर्शित करता है |
<?php
echo $e->getPrevious();
?>
|
| मिलTraceAsString() | पीछे का भाग प्रदर्शित करता हैtracअपवाद के e को सरणी के बजाय स्ट्रिंग के रूप में लिखें |
<?php
echo $e->getTraceAsString();
?>
|
| __स्ट्रिंग() | संपूर्ण अपवाद को स्ट्रिंग के रूप में प्रदर्शित करता है |
<?php
echo $e->__toString();
?>
|
नीचे अपवाद फेंकने के लिए मूल सिंटैक्स दिया गया है।
<?php throw new Exception("This is an exception example"); ?>
यहाँ,
- “throw” अपवाद को फेंकने के लिए उपयोग किया जाने वाला कीवर्ड है
- “new Exception(…)” एक अपवाद ऑब्जेक्ट बनाता है और “यह एक अपवाद उदाहरण है” स्ट्रिंग को संदेश पैरामीटर के रूप में पास करता है।
उपरोक्त कोड निम्नलिखित संदेश आउटपुट करता है।
अब हम एक ऐसे उदाहरण को देखेंगे जो throw और catch अपवादों को लागू करता है। हम उपरोक्त उदाहरण को संशोधित करेंगे और उसमें try, throw और catch को शामिल करेंगे।
इसका मूल वाक्यविन्यास इस प्रकार है।
<?php try { // code goes here that could potentially throw an exception } catch (Exception $e) { // exception handling code goes here } ?>
यहाँ,
- “try{…}” निष्पादित किया जाने वाला कोड ब्लॉक है जो संभावित रूप से अपवाद उत्पन्न कर सकता है
- “catch(Exception $e){…}” कोड का वह ब्लॉक है जो फेंके गए अपवाद को पकड़ता है और अपवाद ऑब्जेक्ट को वेरिएबल $e को असाइन करता है।
नीचे दिए गए कोड में try, throw और catch का उपयोग करते हुए एक बुनियादी अपवाद का उदाहरण दिखाया गया है। प्रोग्राम जानबूझकर एक अपवाद उत्पन्न करता है जिसे वह बाद में पकड़ लेता है।
<?php try { $var_msg = "This is an exception example"; throw new Exception($var_msg); } catch (Exception $e) { echo "Message: " . $e->getMessage(); echo ""; echo "getCode(): " . $e->getCode(); echo ""; echo "__toString(): " . $e->__toString(); } ?>
ओपन URL http://localhost/phptuts/exception_handling.phpआपको निम्नलिखित परिणाम प्राप्त होंगे।
किसी एक PHP ट्राई स्टेटमेंट के लिए कई अपवाद बनाना भी संभव है, यह इस बात पर निर्भर करता है कि किस प्रकार का अपवाद उत्पन्न होता है।
इस लेख को देखें MySQLकई अपवादों के कार्यान्वयन उदाहरणों के लिए PHP डेटा एक्सेस।
अनेक अपवाद
कई अपवादों को संभालने के लिए कई कैच ब्लॉक का उपयोग किया जाता है। कई अपवाद तब उपयोगी होते हैं जब:
- आप फेंके गए अपवाद के आधार पर एक अनुकूलित संदेश प्रदर्शित करना चाहते हैं
- आप फेंके गए अपवाद के आधार पर एक अद्वितीय ऑपरेशन करना चाहते हैं
नीचे दिया गया फ्लोचार्ट दर्शाता है कि एकाधिक अपवाद कैसे काम करते हैं।
आइए एक ऐसे उदाहरण को देखें जिसमें कई अपवादों का उपयोग किया गया है। हम उस कोड को संशोधित करेंगे जो किसी संख्या को दिए गए हर से विभाजित करता है।
हमें दो प्रकार के अपवादों के घटित होने की उम्मीद है:
- शून्य से विभाजन
- ऋणात्मक संख्या से भाग
सरलता के लिए, हम अपने कैच ब्लॉक में केवल अपवाद का प्रकार प्रदर्शित करेंगे। PHP की अंतर्निहित Exception क्लास का उपयोग अपवाद उत्पन्न करने के लिए किया जाता है। हम दो क्लास बनाएंगे जो Exception क्लास को विस्तारित करती हैं और उनका उपयोग अपवाद उत्पन्न करने के लिए करेंगे।
नीचे दिया गया कोड कार्यान्वयन दर्शाता है।
<?php class DivideByZeroException extends Exception {}; class DivideByNegativeException extends Exception {}; function process($denominator) { try { if ($denominator == 0) { throw new DivideByZeroException(); } else if ($denominator < 0) { throw new DivideByNegativeException(); } else { echo 25 / $denominator; } } catch (DivideByZeroException $ex) { echo "DIVIDE BY ZERO EXCEPTION!"; } catch (DivideByNegativeException $ex) { echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!"; } catch (Exception $x) { echo "UNKNOWN EXCEPTION!"; } } process(0); ?>
कोड का परीक्षण
हम मान लेंगे कि आपने multiple_exceptions.php फ़ाइल को phptuts फ़ोल्डर में सहेजा है।
के लिए ब्राउज़ करें URL http://localhost/phptuts/multiple_exceptions.php
PHP फ़ाइल पर वापस जाएँ और -1 को पैरामीटर के रूप में पास करें जैसा कि निम्नलिखित चित्र में दिखाया गया है।
के लिए ब्राउज़ करें URL http://localhost/phptuts/multiple_exceptions.phpआपको क्या परिणाम मिलते हैं? अब पैरामीटर के रूप में 3 पास करें। आपको क्या परिणाम मिलते हैं?
फाइनली ब्लॉक और PHP 7 त्रुटि मॉडल
आधुनिक PHP उपरोक्त मॉडल में दो महत्वपूर्ण तत्व जोड़ता है। फाइनली ब्लॉक ट्राई और कैच के बाद चलता है, चाहे कोई अपवाद उत्पन्न हुआ हो या नहीं, जो इसे फ़ाइल या डेटाबेस कनेक्शन बंद करने जैसे कार्यों के लिए आदर्श बनाता है।
PHP 7 के बाद से, कई पूर्व घातक त्रुटियों को Error ऑब्जेक्ट के रूप में प्रस्तुत किया जाता है। Exception और Error दोनों ही Throwable इंटरफ़ेस को लागू करते हैं, इसलिए एक catch (\Throwable $e) ब्लॉक दोनों में से किसी को भी संभाल सकता है।
<?php try { $result = 10 / 0; } catch (DivisionByZeroError $e) { echo "Caught: " . $e->getMessage(); } finally { echo "This message always runs"; } ?>
यहां, शून्य से भाग देने पर PHP 8 में DivisionByZeroError उत्पन्न होता है, कैच ब्लॉक इसकी रिपोर्ट करता है, और फाइनली ब्लॉक हमेशा चलता है, चाहे त्रुटि हुई हो या नहीं, अपना संदेश प्रिंट करता है।









