diff --git a/data/class/helper/SC_Helper_HandleError.php b/data/class/helper/SC_Helper_HandleError.php index 251376b42b..a1b1d81843 100644 --- a/data/class/helper/SC_Helper_HandleError.php +++ b/data/class/helper/SC_Helper_HandleError.php @@ -34,6 +34,9 @@ class SC_Helper_HandleError /** エラー処理中か */ static $under_error_handling = false; + /** display_errors の初期値 */ + static $default_display_errors; + /** * 処理の読み込みを行う * @@ -51,21 +54,16 @@ public static function load() // 開発時は -1 (全て) を推奨 error_reporting(E_ALL & ~E_NOTICE & ~E_USER_NOTICE); + static::$default_display_errors = ini_get('display_errors'); + if (!(defined('SAFE') && SAFE === true) && !(defined('INSTALL_FUNCTION') && INSTALL_FUNCTION === true)) { // E_USER_ERROR または警告を捕捉した場合のエラーハンドラ set_error_handler(array(__CLASS__, 'handle_warning'), E_USER_ERROR | E_WARNING | E_USER_WARNING | E_CORE_WARNING | E_COMPILE_WARNING); - // 実質的に PHP 5.2 以降かで処理が分かれる - if (function_exists('error_get_last')) { - // E_USER_ERROR 以外のエラーを捕捉した場合の処理用 - register_shutdown_function(array(__CLASS__, 'handle_error')); - // 以降の処理では画面へのエラー表示は行なわない - ini_set('display_errors', 0); - } else { - // エラー捕捉用の出力バッファリング - ob_start(array(__CLASS__, '_fatal_error_handler')); - ini_set('display_errors', 1); - } + // E_USER_ERROR 以外のエラーを捕捉した場合の処理用 + register_shutdown_function(array(__CLASS__, 'handle_error')); + // 以降の処理では画面へのエラー表示は行なわない + ini_set('display_errors', 0); } } @@ -92,10 +90,22 @@ public static function handle_warning($errno, $errstr, $errfile, $errline) return; } + // パラメーターが読み込まれるまでは、PHP 標準のエラー処理とする。 + // - phpunit の実行中に Warning が出力されることでテストが失敗するテストケースがあっため、除外している。 + if (!defined('ERROR_LOG_REALFILE') && !(defined('TEST_FUNCTION') && TEST_FUNCTION === true)) { + return false; + } + $error_type_name = GC_Utils_Ex::getErrorTypeName($errno); switch ($errno) { case E_USER_ERROR: + // パラメーターが読み込まれるまでは、エラー例外をスローする。(上の分岐があるため phpunit の実行中に限定される。) + if (!defined('ERROR_LOG_REALFILE')) { + ini_set('display_errors', static::$default_display_errors); + throw new ErrorException($errstr, 0, $errno, $errfile, $errline); + } + $message = "Fatal error($error_type_name): $errstr on [$errfile($errline)]"; GC_Utils_Ex::gfPrintLog($message, ERROR_LOG_REALFILE, true); @@ -107,8 +117,10 @@ public static function handle_warning($errno, $errstr, $errfile, $errline) case E_USER_WARNING: case E_CORE_WARNING: case E_COMPILE_WARNING: - $message = "Warning($error_type_name): $errstr on [$errfile($errline)]"; - GC_Utils_Ex::gfPrintLog($message, ERROR_LOG_REALFILE); + if (defined('ERROR_LOG_REALFILE')) { + $message = "Warning($error_type_name): $errstr on [$errfile($errline)]"; + GC_Utils_Ex::gfPrintLog($message, ERROR_LOG_REALFILE); + } return true; @@ -129,6 +141,7 @@ public static function handle_warning($errno, $errstr, $errfile, $errline) * @param string $buffer 出力バッファリングの内容 * @return string|void エラーが捕捉された場合は, エラーページへリダイレクトする; * エラーが捕捉されない場合は, 出力バッファリングの内容を返す + * @deprecated 2.18 EC-CUBE 本体では使用していない。 */ static function &_fatal_error_handler(&$buffer) { @@ -179,6 +192,12 @@ public static function handle_error() return; } + // パラメーターが読み込まれるまでは、エラー例外をスローする。 + if (!defined('ERROR_LOG_REALFILE')) { + ini_set('display_errors', static::$default_display_errors); + throw new ErrorException($arrError['message'], 0, $arrError['type'], $arrError['file'], $arrError['line']); + } + $error_type_name = GC_Utils_Ex::getErrorTypeName($arrError['type']); $errstr = "Fatal error($error_type_name): {$arrError['message']} on [{$arrError['file']}({$arrError['line']})]"; diff --git a/tests/require.php b/tests/require.php index 73154f19eb..b353025ed6 100644 --- a/tests/require.php +++ b/tests/require.php @@ -1,6 +1,9 @@