अच्छा प्रश्न। मुझे लगता है कि यह एक सामान्य समस्या हैE_RECOVERABLE_ERROR
PHP में ।
आपके प्रश्न में आपके पास अपवाद हैंडलर है, न कि त्रुटि हैंडलर। त्रुटि हैंडलर वास्तविक समस्या पर चर्चा कर रहा है जिसके कारण आप यहां कैटलेबल फ़ॉल्ट त्रुटियों ( E_RECOVERABLE_ERROR
) के साथ हैं ।
PHP 7 और HHVM ने इसे पहले ही हल कर दिया है।
यह Magento के साथ बदतर है क्योंकि त्रुटि हैंडलर PHP 5.2 त्रुटि वर्ग के बाद से इस के साथ सौदा नहीं करता है।
एक अधिक उपयोगी प्रकार की त्रुटि हैंडलिंग इस त्रुटि वर्ग के साथ काम कर रही होगी और इन त्रुटियों को ErrorException s में बदल देगी । उदाहरण (मेरे द्वारा, यहाँ से नहीं ):
set_error_handler(function($errno, $errstr, $errfile, $errline) {
if ($errno === E_RECOVERABLE_ERROR) {
throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
return false;
});
तो Magento के प्रकाश में, डिफ़ॉल्ट त्रुटि हैंडलर में वैश्विक कार्य mageCoreErrorHandler
है app/code/core/Mage/Core/functions.php
। यह Mage_Core_Model_App ( ) (संरक्षित पद्धति के माध्यम से) Mage::app()
की init()
विधि द्वारा पंजीकृत हो जाता है ।app/code/core/Mage/Core/Model/App.php
_initEnvironment()
एक पर्यवेक्षकcontroller_front_init_before
जिस पर अपने स्वयं के PHP त्रुटि हैंडलर को पंजीकृत करता है, उसके बाद पर्याप्त होना चाहिए (PHP में त्रुटि हैंडलर स्टैकेबल हैं):
$previous = set_error_handler(function($errno, $errstr, $errfile, $errline) use (&$previous) {
if ($errno === E_RECOVERABLE_ERROR) {
throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
if ($previous) {
return call_user_func($previous, $errno, $errstr, $errfile, $errline);
}
return false;
});
कैटलेबल घातक त्रुटियां फिर अपवादों में बदल जाती हैं और आप अपने स्वयं के एक्सटेंशन कोड में उनके साथ सौदा कर सकते हैं या वे अनकैप्ड हैं और अपवाद लॉग में दिखाई देंगे (बजाय अपनी दुकान चलाने के गलत तरीकों पर वर्तमान व्यवहार की तरह गाथा है, मृत प्रोग्राम) झूठ मत बोलो )। PHP 7 में तब अपवाद के लिए देखने के लिए ErrorException नहीं है, लेकिन अब सामने आने वाली त्रुटियों के लिए TypeException (जो एक BaseException है )। ।
मैगेंटो के त्रुटि हैंडलर पर अन्य सभी त्रुटियां पारित की जाती हैं।
नोट: मैंने यह कोशिश नहीं की है, यह एक राइट-अप है, लेकिन मुझे पता है कि आप जिस समस्या के बारे में पूछ रहे हैं और त्रुटि हैंडलिंग विश्लेषण 1.5.1.0 के खिलाफ किया गया है और कोड विश्लेषण के माध्यम से 1.9.1.0 के खिलाफ सत्यापित किया गया है। त्रुटि हैंडलर स्टैकिंग काम करना चाहिए। मैं थोड़ा विस्तारित उदाहरण कोड जोड़ता हूं जो काम करने वाले अधिकांश हिस्सों को प्रदर्शित करता है।
मैंने अभी तक इसे एक Magento एक्सटेंशन के रूप में पैक नहीं किया है, लेकिन इसे सीधे modman के साथ आगे बढ़ाया जाना चाहिए। मैं इसे तब गीथूब पर रखूंगा।
परिशिष्ट: त्रुटि हैंडलर डेमो
निम्न कोड-उदाहरण ( ऑनलाइन डेमो ) त्रुटि संचालकों के स्टैकिंग को दर्शाता है और कैटलेबल घातक त्रुटि पर अपवाद को फेंक रहा है :
<?php
/**
* error handler demonstration
*
* stackable error handle with previous call and catchable error exceptions
*
* @author hakre <http://hakre.wordpress.com>
* @link /magento//a/64972/4115
*/
set_error_handler(function() {
$args = func_get_args();
var_dump("me is the previous error handler", $args);
});
$previous = set_error_handler(function($errno, $errstr, $errfile, $errline) use (&$previous) {
if ($errno === E_RECOVERABLE_ERROR) {
throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
if ($previous) {
return call_user_func($previous, $errno, $errstr, $errfile, $errline);
}
return false;
});
$test = function(callable $test) {};
$a = $undefined; // provoke little warning
$test(new stdClass); // provoke catchable fatal error
प्रोग्राम आउटपुट
string(32) "me is the previous error handler"
array(4) {
[0]=>
int(8)
[1]=>
string(29) "Undefined variable: undefined"
[2]=>
string(45) "/tmp/execpad-0eca072b619d/source-0eca072b619d"
[3]=>
int(28)
}
Fatal error: Uncaught exception 'ErrorException' with message 'Argument 1 passed to {closure}() must be callable, object given, called in /tmp/execpad-0eca072b619d/source-0eca072b619d on line 30 and defined' in /tmp/execpad-0eca072b619d/source-0eca072b619d:26
Stack trace:
#0 /tmp/execpad-0eca072b619d/source-0eca072b619d(26): {closure}(4096, 'Argument 1 pass...', '/tmp/execpad-0e...', 26, Array)
#1 /tmp/execpad-0eca072b619d/source-0eca072b619d(30): {closure}(Object(stdClass))
#2 {main}
thrown in /tmp/execpad-0eca072b619d/source-0eca072b619d on line 26