ভাল প্রশ্ন. আমার মনে E_RECOVERABLE_ERROR
হয় পিএইচপি-তে এটি একটি সাধারণ সমস্যা ।
আপনার প্রশ্নে যা আছে তা ব্যতিক্রম হ্যান্ডলার, ত্রুটি হ্যান্ডলার নয় ler ত্রুটি হ্যান্ডলারটি এখানে ধরা পড়ার মতো মারাত্মক ত্রুটিগুলি ( E_RECOVERABLE_ERROR
) দিয়ে আসল সমস্যাটি সৃষ্টি করছে ।
পিএইচপি 7 এবং এইচএইচভিএম এর ইতিমধ্যে সমাধান হয়েছে।
এটি ম্যাজেন্টোর সাথে আরও খারাপ কারণ ত্রুটি হ্যান্ডলার পিএইচপি 5.2 ত্রুটি শ্রেণি থেকে এটি নিয়ে কাজ করে না।
ত্রুটি পরিচালনার আরও কার্যকর ধরণটি এই ত্রুটি শ্রেণীর সাথে ডিল করবে এবং এই ত্রুটিগুলি ত্রুটিযুক্ত ধারণাটিতে রূপান্তরিত করবে । উদাহরণ (আমার দ্বারা নয়, এখান থেকে ):
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
যার উপরে আপনার নিজের পিএইচপি ত্রুটি হ্যান্ডলারটিকে উপরে রেজিস্ট্রেশন করে তারপরে যথেষ্ট হওয়া উচিত (পিএইচপি-তে ত্রুটি হ্যান্ডলারগুলি স্ট্যাকযোগ্য):
$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;
});
তারপরে ধরা পড়ার মতো মারাত্মক ত্রুটিগুলি ব্যতিক্রমগুলিতে রূপান্তরিত হয় এবং আপনি তাদের নিজের এক্সটেনশন কোডে তাদের সাথে ডিল করতে পারেন বা এগুলি অপ্রকাশিত এবং ব্যতিক্রম লগতে দেখা যাবে (পরিবর্তে আপনার দোকানটিকে বর্তমান আচরণের মতো ভুল ধরণের উপর চালানো না হওয়া, মৃত প্রোগ্রামগুলি) মিথ্যা বলবেন না )। পিএইচপি 7-তে ব্যতিক্রম ত্রুটিযুক্ত ধারণা নয় তবে টাইপ এক্সেসেপশন (যা একটি বেসএক্সেপশন ) এখন ক্যাপচারযোগ্য মারাত্মক ত্রুটির জন্য ।
অন্যান্য সমস্ত ত্রুটিগুলি ম্যাজেন্টোর ত্রুটি হ্যান্ডলারের হাতে দেওয়া হয়েছে।
দ্রষ্টব্য: আমি এটি চেষ্টা করে দেখিনি, এটি একটি লিখন-আপ তবে আমি জানি যে সমস্যাটি সম্পর্কে আপনি জিজ্ঞাসা করছেন এবং ত্রুটি পরিচালনার বিশ্লেষণ 1.5.1.1.0 এর বিপরীতে করা হয়েছে এবং কোড বিশ্লেষণের মাধ্যমে 1.9.1.0 এর বিপরীতে যাচাই করা হয়েছে। ত্রুটি হ্যান্ডলার স্ট্যাকিং কাজ করা উচিত। আমি কিছুটা বর্ধিত উদাহরণ কোড সংযোজন করি যা বেশিরভাগ অংশে কাজ করে।
আমি এখনও এটি ম্যাজেন্টো এক্সটেনশন হিসাবে প্যাকেজ করেছি না তবে এটি মোডম্যানের সাথে সরাসরি হওয়া উচিত। আমি তখন এটি গিথুবে রাখব।
পরিশিষ্ট: ত্রুটি হ্যান্ডলার ডেমো
নিম্নলিখিত কোড-উদাহরণ ( অনলাইন ডেমো ) ত্রুটি পরিচালনাকারীদের স্ট্যাকিং এবং ক্যাচব্যাবল মারাত্মক ত্রুটির উপর ব্যতিক্রম ছোঁড়া প্রদর্শন করে :
<?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