良い質問。これはE_RECOVERABLE_ERROR
PHPの一般的な問題だと思います。
あなたは、あなたの質問を持っているとすると、例外ハンドラではなく、エラーハンドラです。エラーハンドラは、とあなたはここで議論し、実際の問題を引き起こしている捕捉可能な致命的なエラー(E_RECOVERABLE_ERROR
)。
PHP 7とHHVMが、これはすでに解決しています。
エラーハンドラは、PHP 5.2のエラークラスので、これに対処しないので、それは、Magentoのと悪化します。
エラー処理のより有用な種類は、このエラークラスに対処されるだろうとの中にこれらのエラーをオンにするErrorException秒。例(ない私が、ここから):
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::app()
によるinit()
方法Mage_Core_Model_App(app/code/core/Mage/Core/Model/App.php
(保護経由)_initEnvironment()
メソッド)。
独自のPHPエラーハンドラーを最上位に登録するオブザーバーでcontroller_front_init_before
十分です(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今のところ)捕捉可能致命的なエラー。
他のすべてのエラーは、Magentoのエラーハンドラに渡されます。
注:私はこれを試したことはありません、それは書き込みです、しかし、私はあなたが尋ねている問題を知っていて、エラー処理分析は1.5.1.0に対して行われ、コード分析を通じて1.9.1.0に対して検証されました。エラーハンドラーのスタックは機能するはずです。ほとんどの部品が動作することを示す、少し拡張されたサンプルコードを追加します。
私はまだこれをmagento拡張としてパッケージ化していませんが、modmanで簡単にできるはずです。私は、githubの上に置きましたよ。
付録:エラーハンドラーのデモ
次のコード例(オンラインデモ)は、キャッチ可能な致命的なエラーでエラーハンドラーと例外をスローするスタックを示しています。
<?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