दिलचस्प पोस्ट
Android वैश्विक चर YUV को बिटमैप सरणी कनवर्ट करें (YCbCr NV21) जावा में 2 डी मैट्रिक्स में सर्कल के रूप में डबल मान का प्रतिनिधित्व कैसे करें ऑपरेटर ओवरलोडिंग: सदस्य फ़ंक्शन बनाम गैर सदस्यीय फ़ंक्शन? jQuery और AJAX प्रतिक्रिया शीर्षक अपवाद कोड: 0xE0434352 के साथ स्टार्टअप पर मैं .NET विंडोज़ एप्लिकेशन क्रैशिंग कैसे ठीक करूं? क्यों नहीं std :: cout आउटपुट पूरी तरह से गायब हो जाता है जब यह नल को भेजा जाता है पायथन नाम मैंगलिंग स्मृति आवंटन की समय की जटिलता गतिशील रूप से फेसबुक ओपन ग्राफ़ मेटा टैग जेनरेट करना जावा में एक सादा पाठ फ़ाइल पढ़ना आप TypeScript में `विंडो` पर एक नई संपत्ति को कैसे स्पष्ट रूप से सेट करते हैं? गतिशील रूप से JfreeChart के साथ XYSeries को अंक जोड़ना क्या सभी समय बहिष्कृत करने का कोई तरीका है? जब मैं किसी निष्पादक सेवा पर समापन सेवा का उपयोग करूँ?

PHP में ऑपरेटर के साथ त्रुटि दबाएं

आपकी राय में, क्या यह कभी भी @ ऑपरेटर को PHP / में त्रुटि / चेतावनी को दबाने के लिए वैध है, जबकि आप त्रुटि को संभाल सकते हैं?

यदि हां, तो आप किस परिस्थिति में इसका इस्तेमाल करेंगे?

कोड उदाहरणों का स्वागत है

संपादित करें: repliers को नोट करें मैं त्रुटि रिपोर्टिंग बंद करने के लिए नहीं देख रहा हूँ, लेकिन, उदाहरण के लिए, सामान्य अभ्यास का उपयोग करना है

@fopen($file); 

और फिर बाद में जांचें … लेकिन आप @ करके छुटकारा पा सकते हैं

 if (file_exists($file)) { fopen($file); } else { die('File not found'); } 

या इसी के समान।

मुझे लगता है कि सवाल यह है – क्या वहां कहीं भी है जो कि एक त्रुटि को दबाने के लिए इस्तेमाल किया जा रहा है, जिसे किसी अन्य तरीके से संभाला नहीं जा सकता है?

वेब के समाधान से एकत्रित समाधान "PHP में ऑपरेटर के साथ त्रुटि दबाएं"

मैं इस त्रुटि को दबाने दूँगा और उसे संभालना होगा । अन्यथा आपके पास एक TOCTOU मुद्दा हो सकता है (समय-का-जांच, समय-का-उपयोग। उदाहरण के लिए file_exists सही होने पर फ़ाइल को हटा दिया जा सकता है, लेकिन एफओपीन से पहले)।

लेकिन मैं उन्हें दूर करने के लिए त्रुटियों को दबाने ही नहीं करता। ये बेहतर दिखाई दे रहे हैं

नोट: सबसे पहले, मुझे एहसास हुआ कि 99% PHP डेवलपर्स त्रुटि दमन ऑपरेटर का उपयोग करते हैं (मैं उनमें से एक था), इसलिए मैं किसी भी PHP देव की उम्मीद कर रहा हूं जो इससे असहमत हो।

आपकी राय में, क्या यह कभी भी @ ऑपरेटर को PHP / में त्रुटि / चेतावनी को दबाने के लिए वैध है, जबकि आप त्रुटि को संभाल सकते हैं?

संक्षिप्त जवाब:
नहीं!

अधिक सही जवाब:
मुझे नहीं पता है कि मुझे सब कुछ पता नहीं है, लेकिन अभी तक मैं ऐसी स्थिति में नहीं आया हूं जहां यह एक अच्छा समाधान था।

क्यों यह बुरा है:
मुझे लगता है कि लगभग 7 साल पीएचपी का उपयोग करते हुए मैंने त्रुटि दमन ऑपरेटर की वजह से अंतहीन डीबगिंग पीड़ा देखी है और कभी भी ऐसी स्थिति में नहीं आया जहां यह अपरिहार्य था।

समस्या यह है कि आपके द्वारा त्रुटियों को दबाने वाले कोड का टुकड़ा, वर्तमान में केवल आपके द्वारा देखे जा रहे त्रुटि का कारण हो सकता है; हालांकि जब आप उस कोड को बदलते हैं जिसे दबाना लाइन पर निर्भर करता है, या उसमें पर्यावरण चलाता है, तो हर मौका यह है कि लाइन उस अनदेखा त्रुटि को आउटपुट करने का प्रयास करेगी, जिसे आप अनदेखा करने की कोशिश कर रहे थे। फिर आप एक त्रुटि को कैसे ट्रैक करते हैं जो कि आउटपुट नहीं है? डीबगिंग नरक में आपका स्वागत है!

यह मुझे एहसास करने के लिए कई सालों तक ले गया कि दबदबा गई त्रुटियों के कारण मैं हर कुछ महीनों में कितना समय बर्बाद कर रहा था सबसे अधिक बार (लेकिन विशेष रूप से नहीं) यह एक तीसरी पार्टी स्क्रिप्ट / एप / लाइब्रेरी स्थापित करने के बाद थी, जो डेवलपर के वातावरण में त्रुटि मुक्त थी, लेकिन मेरे कारण नहीं कि एक php या सर्वर कॉन्फ़िगरेशन फ़र्क या विफलता की वजह से जो सामान्य रूप से एक त्रुटि को तुरंत आउटपुट कर सके क्या मुद्दा था, लेकिन जब देव जादू @ जोड़ता है, तब तक नहीं चेतावनी

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

नियमित त्रुटियों के लिए आप एक त्रुटि हैंडलर सेट कर सकते हैं ताकि आप जब आप पृष्ठ देख रहे हों, लेकिन अंत उपयोगकर्ताओं से छिपाए गए हों और लॉग इन किए गए तरीके से आउटपुट तैयार करें ताकि आप जान सकें कि आपके उपयोगकर्ता क्या ट्रिगर कर रहे हैं

घातक त्रुटियों के लिए display_errors को बंद करें (आपका त्रुटि हैंडलर अभी भी ट्रिगर हो जाता है) आपके php.ini में और त्रुटि लॉगिंग सक्षम करें यदि आपके पास एक डेवलपमेंट सर्वर है और साथ ही एक लाइव सर्वर (जो मैं सुझाता हूं) तो यह कदम आपके डेवलपमेंट सर्वर पर जरूरी नहीं है, इसलिए आप अभी भी इन गंभीर त्रुटियों को त्रुटि लॉग फ़ाइल को देखे बिना रिबूट कर सकते हैं। आपके त्रुटि हैंडलर को बहुत बड़ी घातक त्रुटियों को भेजने के लिए शटडाउन फ़ंक्शन का उपयोग करके भी एक चाल है

संक्षेप में:
कृपया इसे से बचें इसके लिए एक अच्छा कारण हो सकता है, लेकिन मैं अभी तक एक देख रहा हूं, इसलिए उस दिन तक मेरी राय है कि (@) त्रुटि दमन ऑपरेटर बुरा है।

यदि आप अधिक जानकारी चाहते हैं तो आप PHP मैन्युअल में त्रुटि नियंत्रण ऑपरेटर पृष्ठ पर मेरी टिप्पणी पढ़ सकते हैं।

हाँ दमन समझ में आता है

उदाहरण के लिए, अगर फाइल को खोला नहीं जा सकता है, तो fopen() कमांड FALSE लौटाता है। यह ठीक है, लेकिन यह एक PHP चेतावनी संदेश भी पैदा करता है। अक्सर आप चेतावनी नहीं चाहते – आप अपने आप को FALSE जांच करेंगे

वास्तव में PHP मैनुअल विशेष रूप से इस मामले में @ का उपयोग करने का सुझाव देता है!

यदि आप फ़ोकन () जैसी फ़ंक्शन का उपयोग करते समय फेंका गया चेतावनी नहीं चाहते हैं, तो आप त्रुटि को दबा सकते हैं लेकिन अपवादों का उपयोग कर सकते हैं:

 try { if (($fp = @fopen($filename, "r")) == false) { throw new Exception; } else { do_file_stuff(); } } catch (Exception $e) { handle_exception(); } 

त्रुटि दमन से बचना चाहिए जब तक आप यह नहीं जानते कि आप सभी स्थितियों को संभाल सकते हैं।

यह पहली बार ऐसा लगता है जितना कठिन हो सकता है

आपको वास्तव में क्या करना चाहिए, आपकी रिपोर्टिंग विधि के लिए PHP के "error_log" पर भरोसा करना है, क्योंकि आप उपयोगकर्ताओं को त्रुटियों की रिपोर्ट करने के लिए पृष्ठों को देखने पर भरोसा नहीं कर सकते। (और आपको इन त्रुटियों को प्रदर्शित करने से php को भी अक्षम करना चाहिए)

फिर कम से कम आपके पास सिस्टम में गलत होने वाली सभी चीजों की एक व्यापक रिपोर्ट होगी।

यदि आपको वाकई त्रुटियों को संभालना है, तो आप कस्टम त्रुटि हैंडलर बना सकते हैं

http://php.net/set-error-handler

तब आप संभवत: अपवाद भेज सकते हैं (जो कि संभाला जा सकता है) और प्रशासन को अजीब त्रुटियों की रिपोर्ट करने के लिए कुछ भी आवश्यक है।

मैं अपने आप को '@' … अवधि का उपयोग करने की अनुमति नहीं देता।

जब मैं कोड में '@' के उपयोग का पता लगाता हूं, तो मैं टिप्पणी के लिए इसे स्पष्ट रूप से स्पष्ट करने के लिए जोड़ता हूं, दोनों उपयोग के बिंदु पर और उस समारोह के आसपास डॉकब्लॉक में जहां इसका इस्तेमाल होता है इस तरह की त्रुटि दमन के कारण मुझे "भूत का पीछा" डिबगिंग करके भी काट लिया गया है, और मुझे उम्मीद है कि जब मैं इसे खोजता हूं, तब इसका उपयोग हाइलाइट करने से अगले व्यक्ति पर इसे आसान बनाना होगा।

ऐसे मामलों में जहां मैं एक अपवाद फेंकने के लिए अपना कोड चाहता हूं यदि कोई मूल PHP फ़ंक्शन किसी त्रुटि का सामना करता है, और '@' को जाने का आसान तरीका लगता है, तो मैं इसके बजाय कुछ और करने का चयन करता हूं जो उसी परिणाम को प्राप्त करता है (फिर से) स्पष्ट रूप से कोड में स्पष्ट:

 $orig = error_reporting(); // capture original error level error_reporting(0); // suppress all errors $result = native_func(); // native_func() is expected to return FALSE when it errors error_reporting($orig); // restore error reporting to its original level if (false === $result) { throw new Exception('native_func() failed'); } 

यह बहुत अधिक कोड है जो सिर्फ लिख रहा है:

 $result = @native_func(); 

लेकिन मैं गरीब दबाने वाली आत्मा की खातिर मेरे दमन को बहुत ज़रूरी बनाना चाहता हूं, जो मेरे पीछे है

अधिकांश लोग त्रुटि संदेश के अर्थ को नहीं समझते हैं
मजाक नहीं। उनमें से अधिकांश।

उन्हें लगता है कि त्रुटि संदेश सभी समान हैं, कहते हैं, "कुछ गलत हो गया है!"
वे इसे पढ़ने के लिए परेशान नहीं करते
हालांकि यह त्रुटि संदेश का सबसे महत्वपूर्ण हिस्सा है – न केवल यह तथ्य उठाया गया है, लेकिन इसका अर्थ है यह आपको बता सकता है कि क्या गलत हो रहा है। त्रुटि संदेश मदद के लिए हैं, आपको परेशान करने के लिए नहीं "यह कैसे छुपाना है?" मुसीबत। यह नौसिखिया वेब-प्रोग्रामिंग दुनिया में सबसे बड़ी गलतफहमी में से एक है

इस प्रकार, गैगिंग त्रुटि संदेश की बजाय, इसे पढ़ना चाहिए कि वह क्या कहता है। इसमें न केवल एक "फाइल मिली है" मान है हजारों भिन्न त्रुटियां हो सकती हैं: permission denied , save mode restriction को open_basedir restriction , open_basedir restriction etc.etc प्रत्येक को उचित कार्रवाई की आवश्यकता होती है लेकिन अगर आप इसे झूठ बोलते हैं तो आपको कभी पता नहीं चलेगा कि क्या हुआ!

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

इस प्रकार, कभी गप त्रुटि संदेश नहीं। दोनों प्रोग्रामर के लिए इसे लॉग इन करते हैं , और उपयोगकर्ता के लिए इसे संभालते हैं

क्या php.ini चेतावनियों और त्रुटियों से दबाने का कोई तरीका नहीं है? उस मामले में आप केवल एक झंडा बदल कर डिबग कर सकते हैं और यह पता लगाने की कोशिश नहीं कर सकते कि @ समस्या छिपा रहा है।

@ का प्रयोग कभी-कभी उत्पादक है। मेरे अनुभव में, आपको हमेशा php.ini या कॉल में त्रुटि रिपोर्टिंग बंद करना चाहिए

 error_reporting(0); 

उत्पादन स्थल पर इस तरह जब आप विकास में होते हैं तो आप बस लाइन पर टिप्पणी कर सकते हैं और डिबगिंग के लिए दिखाई देने वाली त्रुटियों को देख सकते हैं।

एकमात्र ऐसा जगह है जहां मुझे वास्तव में इसका उपयोग करने की आवश्यकता थी, यह एवल फ़ंक्शन है Eval के साथ समस्या यह है कि, सिंटैक्स त्रुटि के कारण स्ट्रिंग को पार्स नहीं किया जा सकता है, eval झूठी वापसी नहीं करता है, बल्कि एक त्रुटि को फेंकता है, बस नियमित स्क्रिप्ट में पार्स त्रुटि होने की तरह यह जांचने के लिए कि क्या स्ट्रिंग में लिखी गई स्क्रिप्ट पारस्परिक है, आप इस तरह से कुछ का उपयोग कर सकते हैं:

 $script_ok = @eval('return true; '.$script); 

AFAIK, यह ऐसा करने का सबसे शानदार तरीका है

एक जगह मैं इसका उपयोग सॉकेट कोड में कर रहा हूँ, उदाहरण के लिए, यदि आपके पास एक टाइमआउट सेट है, तो आपको इस पर एक चेतावनी मिलेगी यदि आप @ में शामिल नहीं हैं, भले ही यह एक पैकेट नहीं प्राप्त करने के लिए मान्य है।

 $data_len = @socket_recvfrom( $sock, $buffer, 512, 0, $remote_host, $remote_port ) 

आप सब कुछ को दबाने के लिए नहीं चाहते हैं, क्योंकि यह आपकी स्क्रिप्ट को धीमा कर देती है

और हां, एक ही तरीका है php.ini में और त्रुटियों को निकालने के लिए अपनी स्क्रिप्ट में (लेकिन केवल जब आप एक लाइव वातावरण में हैं और php से अपनी त्रुटियों को लॉग करते हैं)

 <?php error_reporting(0); ?> 

और आप इसे इसे बंद करने के php.ini संस्करण के लिए पढ़ सकते हैं।

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

3 फ़ंक्शन लिखें और इस तरह कॉल करें

 # supress error for this statement supress_error_start(); $mail_sent = mail($EmailTo, $Subject, $message,$headers); supress_error_end(); #Don't forgot to call this to restore error. function supress_error_start(){ set_error_handler('nothing'); error_reporting(0); } function supress_error_end(){ set_error_handler('my_err_handler'); error_reporting('Set this to a value of your choice'); } function nothing(){ #Empty function } function my_err_handler('arguments will come here'){ //Your own error handling routines will come here } 

एक DOMDocument ऑब्जेक्ट के रूप में प्रसंस्करण के लिए एक HTML फ़ाइल लोड करने का प्रयास करते समय मैं इसका उपयोग करता हूं। अगर एचटीएमएल में कोई समस्या है … और क्या कम से कम एक वेबसाइट नहीं है … DOMDocument-> loadHTMLFile () एक त्रुटि फेंक देगा यदि आप इसे @ के साथ दबाने नहीं देते हैं यह एकमात्र तरीका है (शायद बेहतर हैं) मैं कभी भी PHP में HTML स्क्रैपर बनाने में सफल रहा हूं।