PHP ट्राई कैच उदाहरण: अपवाद और त्रुटि प्रबंधन ट्यूटोरियल
एक अपवाद क्या है?
त्रुटि एक अप्रत्याशित प्रोग्राम परिणाम है जिसे प्रोग्राम द्वारा स्वयं नियंत्रित नहीं किया जा सकता।
प्रोग्राम को ठीक करके त्रुटियों का समाधान किया जाता है। त्रुटि का एक उदाहरण एक अनंत लूप होगा जो कभी भी निष्पादित होना बंद नहीं करता है।
अपवाद अप्रत्याशित प्रोग्राम परिणाम है जिसे प्रोग्राम द्वारा ही नियंत्रित किया जा सकता है।
अपवाद के उदाहरणों में ऐसी फ़ाइल को खोलने का प्रयास करना शामिल है जो मौजूद नहीं है।
इस अपवाद को या तो फ़ाइल बनाकर या उपयोगकर्ता को फ़ाइल खोजने का विकल्प प्रस्तुत करके नियंत्रित किया जा सकता है।
अपवाद को क्यों संभालें?
- हमारे पृष्ठों पर अप्रत्याशित परिणामों से बचें जो हमारे अंतिम उपयोगकर्ताओं के लिए बहुत कष्टप्रद या परेशान करने वाले हो सकते हैं
- दुर्भावनापूर्ण उपयोगकर्ताओं द्वारा हमारे अनुप्रयोगों पर हमला करने के लिए उपयोग की जाने वाली जानकारी को उजागर न करके हमारे अनुप्रयोगों की सुरक्षा में सुधार करें
- यदि कोई पूर्वानुमानित त्रुटि घटित होती है तो प्रोग्राम के सामान्य प्रवाह को बदलने के लिए PHP अपवादों का उपयोग किया जाता है।
PHP त्रुटि प्रबंधन
जब कोई त्रुटि उत्पन्न होती है, तो आपकी कॉन्फ़िगरेशन सेटिंग्स के आधार पर, PHP वेब ब्राउज़र में हुई त्रुटि से संबंधित जानकारी के साथ त्रुटि संदेश प्रदर्शित करता है।
PHP त्रुटियों को संभालने के लिए कई तरीके प्रदान करता है।
हम तीन (3) सामान्यतः प्रयुक्त विधियों पर गौर करने जा रहे हैं;
- डाई कथन- डाई फ़ंक्शन इको और एग्जिट फ़ंक्शन को एक में जोड़ता है। यह तब बहुत उपयोगी होता है जब हम कोई संदेश आउटपुट करना चाहते हैं और त्रुटि होने पर स्क्रिप्ट निष्पादन को रोकना चाहते हैं।
- कस्टम त्रुटि हैंडलर - ये उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन हैं जिन्हें त्रुटि होने पर बुलाया जाता है।
- 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 "Opps, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
यूआरएल खोलें 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_ERROR); |
E_उपयोगकर्ता_चेतावनी | उपयोगकर्ता द्वारा उत्पन्न चेतावनी संदेश प्रदर्शित करता है | त्रुटि_रिपोर्टिंग(E_USER_WARNING); |
E_USER_NOTICE | उपयोगकर्ता द्वारा उत्पन्न सूचनाएँ प्रदर्शित करता है | त्रुटि_रिपोर्टिंग(E_USER_NOTICE); |
E_पुनर्प्राप्तियोग्य_त्रुटि | ऐसी त्रुटियाँ प्रदर्शित करता है जो घातक नहीं हैं और जिन्हें कस्टम त्रुटि हैंडलर का उपयोग करके नियंत्रित किया जा सकता है | त्रुटि_रिपोर्टिंग(E_RECOVERABLE_ERROR); |
ई_सभी | सभी त्रुटियाँ और चेतावनियाँ प्रदर्शित करता है | त्रुटि_रिपोर्टिंग(E_ ALL); |
त्रुटियाँ और अपवाद के बीच अंतर
- अपवादों को फेंका जाता है और उन्हें पकड़ लिया जाता है, जबकि त्रुटियाँ आमतौर पर अप्राप्य होती हैं।
- अपवादों को ऑब्जेक्ट ओरिएंटेड तरीके से नियंत्रित किया जाता है। इसका मतलब यह है कि जब कोई अपवाद फेंका जाता है; एक अपवाद ऑब्जेक्ट बनाया जाता है जिसमें अपवाद विवरण शामिल होता है।
नीचे दी गई तालिका अपवाद ऑब्जेक्ट विधियों को दर्शाती है
विधि | विवरण | उदाहरण |
---|---|---|
संदेश प्राप्त करें() | अपवाद का संदेश प्रदर्शित करता है |
<?php echo $e->getMessage(); ?> |
कोड प्राप्त करें() | अपवाद को दर्शाने वाला संख्यात्मक कोड प्रदर्शित करता है |
<?php echo $e->getCode(); ?> |
फ़ाइल प्राप्त करें() | फ़ाइल का नाम और पथ प्रदर्शित करता है जहाँ अपवाद उत्पन्न हुआ |
<?php echo $e->getFile(); ?> |
लाइन में आओ() | वह पंक्ति संख्या प्रदर्शित करता है जहां अपवाद उत्पन्न हुआ |
<?php echo $e->getLine(); ?> |
गेटट्रेस() | अपवाद से पहले बैकट्रेस की एक सरणी प्रदर्शित करता है |
<?php print_r( $e->getTrace()); ?> |
getPrevious() | वर्तमान अपवाद से पहले पिछले अपवाद को प्रदर्शित करता है |
<?php echo $e->getPrevious(); ?> |
getTraceAsString() | अपवाद के बैकट्रेस को सारणी के बजाय स्ट्रिंग के रूप में प्रदर्शित करता है |
<?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(); } ?>
यूआरएल खोलें http://localhost/phptuts/exception_handling.php आपको निम्नलिखित परिणाम मिलेंगे।
अपवाद के प्रकार के आधार पर एक php try कथन के लिए एकाधिक अपवाद बनाना भी संभव है।
इस लेख को देखें MySQL, PHP डेटा एक्सेस… कई अपवादों के कार्यान्वयन उदाहरणों के लिए
अनेक अपवाद
मल्टीपल एक्सेप्शन फेंके गए अपवादों को संभालने के लिए मल्टीपल ट्राई कैच ब्लॉक का उपयोग करते हैं। मल्टीपल एक्सेप्शन तब उपयोगी होते हैं जब;
- आप फेंके गए अपवाद के आधार पर एक अनुकूलित संदेश प्रदर्शित करना चाहते हैं
- आप फेंके गए अपवाद के आधार पर एक अद्वितीय ऑपरेशन करना चाहते हैं
नीचे दिया गया फ़्लोचार्ट दर्शाता है कि एकाधिक अपवाद कैसे काम करते हैं
आइए एक उदाहरण देखें जिसमें एकाधिक अपवादों का उपयोग किया गया है।
हम उस कोड को संशोधित करेंगे जो किसी संख्या को उसके हर से विभाजित करता है।
हम दो प्रकार के अपवादों की अपेक्षा करते हैं;
- शून्य से विभाजन
- ऋणात्मक संख्या से भाग
सरलता के लिए, हम अपने कैच ब्लॉक में केवल अपवाद प्रकार ही प्रदर्शित करेंगे।
PHP में निर्मित 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 कोड द्वारा उत्पन्न अप्रत्याशित परिणाम हैं
- त्रुटि प्रबंधन से अनुप्रयोग का प्रदर्शन बेहतर होता है
- PHP में ऐसे अंतर्निहित फ़ंक्शन हैं जिनका उपयोग PHP द्वारा त्रुटियों की रिपोर्ट करने के तरीके को अनुकूलित करने के लिए किया जा सकता है
- अपवाद त्रुटियों की तरह होते हैं, लेकिन उन्हें फेंके जाने पर कैच ब्लॉक का उपयोग करके पकड़ा जा सकता है।
- त्रुटि जानकारी दिखाने वाले त्रुटि संदेश प्रदर्शित करना एक खराब सुरक्षा अभ्यास माना जाता है।