2013-02-08 25 views
8

में से निपटने के अपने प्रोजेक्ट में सभी PHP त्रुटियों मैं अपने त्रुटि हैंडलिंग तंत्र की स्थापना की है के रूप में इस को पकड़ने के लिए:त्रुटि CodeIgniter

  1. मैं index.php फ़ाइल जो php.ini फ़ाइल में कुछ भी ओवरराइड करता है में error_reporting() निर्धारित किया है
  2. कोई त्रुटि हैंडलर set_error_handler का उपयोग कर system/codeigniter/CodeIgniter.php में सेट किया गया है -, इस त्रुटि हैंडलर, _exception_handler system/codeigniter/Common.php
  3. में पाया जाता हैसमारोह E_STRICT त्रुटियों पर ध्यान नहीं देता, अगर गंभीरता कि है अपने error_reporting() समारोह से index.php में निर्दिष्ट अपवाद प्रणाली लाइब्रेरी से show_php_error फ़ंक्शन को कॉल और त्रुटि लॉग जो आप अपने config.php फ़ाइल
  4. हैंडलर में की स्थापना की है के अनुसार FALSE लौटाता है, इसलिए इस PHP के बाद त्रुटि को संभालने के लिए चला जाता है, हालांकि यह आमतौर पर आपके error_reporting स्तर और display_errors सेटिंग के अनुसार होगा।

बात यह है कि मुझे puzzling है कि E_ERROR त्रुटियों अर्थात घातक त्रुटियों बिल्कुल _exception_handler द्वारा पकड़े जाने लगते नहीं है। यह सिर्फ show_php_error नहीं कहा जा रहा है, ऐसा लगता है कि फ़ंक्शन सिर्फ उनके लिए नहीं कहा जा रहा है। यह स्पष्ट रूप से एक समस्या है क्योंकि इसका मतलब है कि उन्हें show_php_error या लॉग इन नहीं किया जाता है। उदाहरण के लिए यदि मैं जानबूझकर $this->load->views('foo'); नियंत्रक में गलत टाइप करता हूं, तो हैंडलर को कॉल नहीं किया जाता है।

त्रुटि प्रबंधन के बारे में कोई सुझाव बहुत सराहना की जाएगी, धन्यवाद!

+0

मुझे लगता है कि यह परीक्षण करने में सक्षम होने के बिना PHP के साथ कोई समस्या हो सकती है। यदि आप http://www.php.net/manual/en/function.error- रिपोर्टिंग देखते हैं।php # 70126 आप देखेंगे कि इस मामले में, E_ERROR एक समान प्रभाव का कारण बनता है जो E_PARSE करेगा। – David

+0

आप किस पर्यावरण का उपयोग कर रहे हैं? – bottleboot

उत्तर

4

अब यह एक बड़ी बहस है: चाहे आपको घातक त्रुटियों को पकड़ना चाहिए या नहीं। कुछ कहते हैं कि वे FATAL हैं इसलिए आप नहीं जानते कि कौन सी स्थिति प्रणाली है लेकिन मैं "त्रुटि होने पर सफाई करने का प्रयास करें" के साथ जाऊंगा। सभी घातक त्रुटियों को पकड़ने के लिए आपको एक pre_system हुक सेट करने की आवश्यकता होगी। आवेदन/config/hooks.php के पास जाकर

$hook['pre_system'][] = array(
'class' => 'PHPFatalError', 
'function' => 'setHandler', 
'filename' => 'PHPFatalError.php', 
'filepath' => 'hooks' 
); 

दर्ज करने के बाद कि हुक निर्देशिका के लिए जाना और त्रुटि के अपने को संभालने जोड़ें: के रूप में आप हम को register_shutdown_function उपयोग कर रहे हैं देख सकते हैं

<?php 
    class PHPFatalError { 

    public function setHandler() { 
      register_shutdown_function('handleShutdown'); 
     } 

    } 

    function handleShutdown() { 
     if (($error = error_get_last())) { 
      ob_start(); 
       echo "<pre>"; 
      var_dump($error); 
       echo "</pre>"; 
      $message = ob_get_clean(); 
      sendEmail($message); 
      ob_start(); 
      echo '{"status":"error","message":"Internal application error!"}'; 
      ob_flush(); 
      exit(); 
     } 
    } 

एक ऐसा फ़ंक्शन चलाएं जो जांचता है कि कोई त्रुटि हुई है और यदि वह इसे डेवलपर को ईमेल के माध्यम से भेजती है। यह सेटअप कई सीआई परियोजनाओं में 2 वर्षों से अधिक समय तक काम कर रहा है जिनके साथ मैं काम कर रहा हूं।

+0

हाय टिक्स, मुझे लगता है कि यह वास्तव में अच्छा दृष्टिकोण है, लेकिन मेरे मामले में मैंने एक अनुकूलित दृष्टिकोण विकसित किया था जहां परियोजना के समग्र त्रुटियों को संभालने के लिए मेरे पास एक सहायक वर्ग में register_shutdown_function() था ... धन्यवाद – troy

+0

ठीक है आप ढेर कर सकते हैं register_shutdown_function() लेकिन कोई अन्य तरीका नहीं है (जहां तक ​​मुझे पता है) कि आप प्रीसिस्टम हुक का उपयोग करने के अलावा घातक त्रुटियों को पकड़ सकते हैं। – tix3

0

मुझे यह उत्तर किसी अन्य प्रश्न (https://stackoverflow.com/a/3675357) के तहत मिला है, और मुझे लगता है कि यह इस प्रश्न को पढ़ने वाले किसी भी व्यक्ति के लिए भी उपयोगी है। "कोडिनेटर विशिष्ट त्रुटि हैंडलिंग के लिए, आप My_Exception क्लास को अपने एप्लिकेशन/लाइब्रेरी फ़ोल्डर में बनाकर अपनी 'अपवाद' लाइब्रेरी क्लास को ओवरराइड कर सकते हैं। इसमें मूल लाइब्रेरी फ़ंक्शन हस्ताक्षर कॉपी करें और अपना कोड डालें। यह निश्चित रूप से काम करेगा।"