PHP त्रुटि हैंडलिंग: डाई () बनाम ट्रिगर_रोर () बनाम फेंक अपवाद


119

PHP में त्रुटि से निपटने के संबंध में - जहाँ तक मुझे पता है कि 3 शैलियाँ हैं:

  1. die()या exit()शैली:

    $con = mysql_connect("localhost","root","password");
    
    if (!$con) {
     die('Could not connect: ' . mysql_error());
    }
  2. throw Exception अंदाज:

     if (!function_exists('curl_init')) {
    
          throw new Exception('need the CURL PHP extension. 
                               Recomplie PHP with curl');
        }
  3. trigger_error() अंदाज:

    if(!is_array($config) && isset($config)) {
            trigger_error('Error: config is not an array or is not set', E_USER_ERROR);
        }

अब, PHP मैन्युअल में सभी तीन विधियों का उपयोग किया जाता है।

  • मैं जानना चाहता हूं कि मुझे किस शैली को पसंद करना चाहिए और क्यों?

  • क्या ये 3 बूंदें एक-दूसरे के प्रतिस्थापन में हैं और इसलिए इनका उपयोग परस्पर किया जा सकता है?

थोड़ा OT: क्या यह सिर्फ मुझे या सभी को लगता है कि PHP त्रुटि हैंडलिंग विकल्प php डेवलपर्स को भ्रमित करने के लिए बहुत अधिक हैं ?


4
ये "शैलियाँ" नहीं हैं। वे विभिन्न भाषा विशेषताएं हैं। विभिन्न उद्देश्यों के लिए।
mario

11
@ उमरियो: विभिन्न इंडेंट उद्देश्य क्या हैं ? कृपया मुझे
बताएं

आपने सवाल को शानदार तरीके से रखा। पूछने के लिए धन्यवाद
एकाउंटेंट

जवाबों:


86

पहले वाले को कभी भी उत्पादन कोड में उपयोग नहीं किया जाना चाहिए, क्योंकि यह सूचना को अप्रासंगिक (अंतिम उपयोगकर्ता के लिए "डेटाबेस से कनेक्ट नहीं कर सकता" ) के लिए अप्रासंगिक है ।

आप अपवादों को फेंक देते हैं यदि आप जानते हैं कि एक महत्वपूर्ण आलोचनात्मक बिंदु पर, आपका आवेदन विफल हो सकता है और आप चाहते हैं कि आपका कोड कई कॉल-स्तरों पर पुनर्प्राप्त हो।

trigger_error()आपको ठीक-ठीक त्रुटि रिपोर्ट करने की अनुमति देता है (विभिन्न स्तरों के त्रुटि संदेशों का उपयोग करके) और आप उन त्रुटियों को अंत-उपयोगकर्ताओं (उपयोग करने वाले set_error_handler()) से छिपा सकते हैं, लेकिन फिर भी उन्हें परीक्षण के दौरान आपको प्रदर्शित किया जाएगा।

trigger_error()कस्टम त्रुटि हैंडलर का उपयोग करके उत्पादन कोड में दबाए जा सकने वाले विकास के दौरान महत्वपूर्ण गैर-घातक संदेश भी उत्पन्न कर सकते हैं। आप घातक त्रुटियां उत्पन्न कर सकते हैं, ( E_USER_ERROR) लेकिन वे पुनर्प्राप्त करने योग्य नहीं हैं। यदि आप उनमें से एक को ट्रिगर करते हैं, तो प्रोग्राम निष्पादन उस बिंदु पर बंद हो जाता है । यही कारण है, घातक त्रुटियों के लिए, अपवाद का उपयोग किया जाना चाहिए। इस तरह, आप अपने कार्यक्रम के प्रवाह पर अधिक नियंत्रण रखेंगे:

// Example (pseudo-code for db queries):

$db->query('START TRANSACTION');

try {
    while ($row = gather_data()) {
       $db->query('INSERT INTO `table` (`foo`,`bar`) VALUES(?,?)', ...);
    }
    $db->query('COMMIT');
} catch(Exception $e) {
    $db->query('ROLLBACK');
}

यहाँ, अगर gather_data()सिर्फ सादा टेढ़ा (उपयोग E_USER_ERRORया die()) एक मौका है, तो पिछले INSERTबयानों ने इसे आपके डेटाबेस में बनाया होगा, भले ही वांछित न हो और आगे क्या होना है, इस पर आपका कोई नियंत्रण नहीं है।


2
इसलिए बाहर trigger_error()और फेंकने वाले अपवाद: मुझे किसका उपयोग करना चाहिए और कब करना चाहिए?
क्यूरियसइंड

@ गौरीश उस पर जोड़ा उदाहरण देखें।
लिनस क्लेन

2
आपके उदाहरण को पढ़ने के बाद, मुझे लगता है कि अब मैं अपवाद को बेहतर ढंग से फेंकने के पीछे के उद्देश्य को समझता हूं। धन्यवाद :)
जिज्ञासु

1
@ स्पेसर जो वास्तव में सर्वर के कॉन्फ़िगरेशन पर निर्भर करता है। एक सिस्टम को डिफ़ॉल्ट रूप से स्वतः पूर्ण में कॉन्फ़िगर किया जा सकता है , इसलिए स्पष्ट है ROLLBACK। यह छद्म-कोड उदाहरण दोनों मामलों को कवर करता है: सर्वर जो ऑटोकॉमिट ( COMMITकथन की आवश्यकता है) से कॉन्फ़िगर नहीं किए गए हैं और जो करते हैं।
लिनुस क्लेन

1
@LinusKleen, एक बार जब हम लाइन चलाते हैं तो स्वतः पूर्ण बंद नहीं होता है query('START TRANSACTION');?
पचेरियर

10

मैं आमतौर पर विकास कोड में सरल डिबगिंग के लिए पहला तरीका उपयोग करता हूं। यह उत्पादन के लिए अनुशंसित नहीं है। सबसे अच्छा तरीका एक अपवाद फेंकना है, जिसे आप कार्यक्रम के अन्य भागों में पकड़ सकते हैं और कुछ त्रुटि को संभालने पर कर सकते हैं।

तीनों शैलियों को एक-दूसरे के लिए प्रतिस्थापन में नहीं रखा गया है। पहले वाला एक त्रुटि नहीं है, लेकिन स्क्रिप्ट को रोकने और मैन्युअल रूप से पार्स करने के लिए आपके लिए कुछ डीबगिंग जानकारी को आउटपुट करने का एक तरीका है। दूसरा एक प्रति त्रुटि नहीं है, लेकिन यदि आप इसे नहीं पकड़ते हैं, तो इसे एक त्रुटि में बदल दिया जाएगा। अंतिम PHP इंजन में एक वास्तविक त्रुटि को ट्रिगर कर रहा है जिसे आपके PHP वातावरण के कॉन्फ़िगरेशन के अनुसार संभाला जाएगा (कुछ मामलों में उपयोगकर्ता को दिखाया गया है, अन्य मामलों में बस एक फ़ाइल में लॉग इन किया गया है या बिल्कुल भी सहेजा नहीं गया है)।


1
क्या होता है जब अपवाद को फेंक दिया जाता है लेकिन पकड़ा नहीं जाता है? मुझे लगता है कि यह एक घातक त्रुटि होगी। और trigger_error()उसी के साथ होता है। तो क्या अंतर है?
जिज्ञासु

4
अंतर यह है कि आप अपवाद को पकड़ सकते हैं और इसे किसी भी तरह से संभाल सकते हैं जो आप चाहते हैं।
एमिल विकस्ट्रॉम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.