2011-09-11 10 views
13

मैं अच्छे प्रोग्रामिंग प्रथाओं का पालन कर रहा हूं और मैं इसे उपयोगकर्ता को प्रदर्शित करने के बजाय PHP त्रुटियों को लॉग इन कर रहा हूं। मैं इसके लिए set_error_handler() का उपयोग करता हूं।@ त्रुटि दमन ऑपरेटर और set_error_handler

अब समस्या। उदाहरण के लिए, मैंने कहीं है:

@file_exists('/some/file/that/is/outside/openbasedir.txt'); 

लेकिन त्रुटि दमन ऑपरेटर के बावजूद, त्रुटि संदेश लॉग। मुझे वह नहीं चाहिए। मैं दबाने वाली त्रुटियों को अपने त्रुटि हैंडलर को पास नहीं करना चाहता हूं।

+2

'@' का उपयोग करने से बचें। यह एक अच्छा संकेत है कि आपने कुछ गलत किया है और इसे ठीक नहीं करना चाहते हैं। हालांकि, त्रुटिरोधक-कॉलबैक को बुलाया जाता है, भले ही कथन स्वयं ही '@ 'के माध्यम से" चुप हो "हो। – KingCrunch

+0

मुझे लगता है कि '@ $ a' का उपयोग' जारीकर्ता ($ ए) के बजाय स्वीकार्य है? $ A: '' '। कोड पठनीयता "नुकसान" से अधिक है। –

+0

@ रोक: आप देखेंगे कि इसमें कुछ प्रदर्शन प्रभाव भी हैं; '@' त्रुटियों को छुपाएं, लेकिन वे अभी भी जेनरेट किए गए हैं, स्वरूपित हैं, त्रुटि हैंडलर कहलाते हैं, इत्यादि। बस अपना कोड तैयार करें ताकि आपको इन्सेट() का उपयोग करने की आवश्यकता न हो। – arnaud576875

उत्तर

23

@ ऑपरेटर अस्थायी रूप से 0 error_reporting सेट, ताकि आप अपने त्रुटि हैंडलर में error_reporting का मूल्य परीक्षण कर सकते हैं:

if (ini_get('error_reporting') == 0) { 
    return; 
} 

या और भी बेहतर, केवल त्रुटि प्रकार है कि error_reporting में हैं लोग इन:

$error_reporting = ini_get('error_reporting'); 

if (!($error_reporting & $errno)) { 
    return; 
} 

इसके अलावा स्वचालित रूप से एक फाइल करने के लिए या syslog में त्रुटियों प्रवेश करने के लिए, log_errors और error_log विकल्पों पर एक नज़र रखना।

+0

तो, मूल रूप से आप कह रहे हैं कि @ ** अस्थायी रूप से ** शून्य में त्रुटि_ रिपोर्टिंग सेट करता है? –

+0

हां, यह वही है जो – arnaud576875

+1

धन्यवाद, यह वही है जो मैंने ** ** से पूछा था। यह पूरी तरह से करता है। –

2

आपको वास्तव में @ ऑपरेटर के उपयोग से बचना चाहिए। सबसे पहले, यह धीमा है, और मैं इसे हानिकारक कहूंगा।

php.ini फ़ाइल में क्या आप के बजाय होना चाहिए है दो लाइन:

error_repoting = E_ALL | E_STRICT 
display_errors = Off 

... या, आप तो index.php के शीर्ष पर, php.ini फ़ाइल के लिए उपयोग नहीं है, तो (या कोई अन्य बूटस्ट्रैप फ़ाइल) आपको जोड़ना चाहिए:

error_reporting(E_ALL | E_STRICT); 
ini_set('display_errors', 0); 
+1

मैं घायल हो गया .. मुझे यहाँ एक डाउनवोट क्यों मिला .. क्या यह वर्तनी थी? –

+1

मैंने डाउनवोट नहीं किया लेकिन केवल @ उपयोग से बचने के लिए कहने से सवाल का जवाब नहीं मिलता है। PHP कभी-कभी अपवाद फेंकता है, जिसे पकड़ा जा सकता है, कभी-कभी बेवकूफ नोटिस प्रदर्शित करता है, जिसे पकड़ा नहीं जा सकता है। उस स्थिति में, पूरे आवेदन के लिए त्रुटियों को बंद करना एक उचित समाधान नहीं है। उन्हें मौके पर शांत करना आदर्श नहीं है, लेकिन थोड़ा बेहतर है (विशेष रूप से फाइल_एक्सिस्ट या फाइल_get_contents जैसे मामलों के लिए जो पहले से ही त्रुटि के मामले में झूठी वापसी करते हैं, इसलिए आपको नोटिस की आवश्यकता नहीं है)। आदर्श रूप में, PHP त्रुटियों की रिपोर्ट के तरीके में तोड़ा नहीं जाएगा, लेकिन चूंकि हमें इसके साथ काम करने की आवश्यकता है। –

संबंधित मुद्दे