İyi soru. Bu E_RECOVERABLE_ERROR
PHP ile genel bir sorun olduğunu düşünüyorum .
Sorunuzla ilgili olarak, hata işleyici değil istisna işleyicisidir. Hata işleyici, burada ele alınabilir ölümcül hatalarla ( E_RECOVERABLE_ERROR
) tartıştığınız asıl soruna neden oluyor .
PHP 7 ve HHVM bunu zaten çözdü.
Magento ile daha da kötüsü çünkü PHP 5.2 hata sınıfından beri hata işleyici bununla ilgilenmez.
Bu hata sınıfıyla ilgilenmek ve bu hataları ErrorException'a dönüştürmek için daha kullanışlı bir hata işleme türü olurdu . Örnek (benim tarafımdan değil, buradan ):
set_error_handler(function($errno, $errstr, $errfile, $errline) {
if ($errno === E_RECOVERABLE_ERROR) {
throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
return false;
});
Yani Magento ışığında, varsayılan hata işleyicisi küresel fonksiyondur mageCoreErrorHandler
içinde app/code/core/Mage/Core/functions.php
. Bu yoluyla kayıtlı s olsun Mage::app()
tarafından init()
yöntemine Mage_Core_Model_App ( app/code/core/Mage/Core/Model/App.php
(korumalı aracılığıyla) _initEnvironment()
yöntemiyle).
Kendi PHP hata işleyicinizi üstüne kaydeden bir gözlemcicontroller_front_init_before
yeterli olacaktır (PHP'deki hata işleyicileri istiflenebilir):
$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;
});
catchable ölümcül hataları daha sonra istisnalara dönüştürülür ve bunlarla kendi uzantı kodunuzda ilgilenebilirsiniz veya yakalanmazlar ve istisna günlüğünde görünürler (mevcut davranışınız gibi yanlış türlerde mağazanızın gaga çalıştırması yerine, ölü programlar yalan söyleme ). PHP 7 aramaya istisna olarak değil ErrorException sonra ancak TypeException (a olan BaseException şimdilik) catchable ölümcül hatalar .
Diğer tüm hatalar Magento hata işleyicisine aktarılır.
Not: Bunu denemedim, bir yazım ama sorduğunuz sorunu biliyorum ve hata işleme analizi 1.5.1.0'a karşı yapılmış ve kod analizi yoluyla 1.9.1.0'a karşı doğrulanmıştır. Hata işleyici yığınının çalışması gerekir. Çoğu parçanın çalıştığını gösteren biraz genişletilmiş örnek kod ekleyin.
Henüz bunu bir magento uzantısı olarak paketlemedim, ancak modman ile düz olmalıdır. Sonra github üzerine koyacağım.
Ek: Hata İşleyici Demosu
Aşağıdaki kod örneği ( çevrimiçi demo ), hata işleyicilerinin yığınlanmasını ve yakalanabilir ölümcül hataya özel durum atmayı gösterir :
<?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
Program Çıkışı
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