为什么我的自定义错误处理程序未调用?

时间:2009-12-27 20:52:16

标签: php error-handling

当我的脚本开始时,我有:

error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

然后,我用PHP注册我的自定义错误处理程序:

function handleError($code, $text, $file, $line) {
    echo "&%!!";
    return true;
}

set_error_handler('handleError');

接下来,出现了一些产生如下错误的代码:

  

致命错误:调用未定义的方法   DB :: getInstanceForDB()in   /Applications/MAMP/htdocs/mysite/classes/Test.php   在第32行

无论我是否指定自定义错误处理程序,我都会继续使用调用堆栈和我网站上的所有内容获取标准PHP错误消息框。知道什么是错的吗?

编辑:无论我是否返回true,它都不会调用我的自定义处理程序。

3 个答案:

答案 0 :(得分:6)

首先,您需要使错误处理函数返回true。来自set_error_handler

  

如果函数返回FALSE,则正常的错误处理程序继续。

其次,请注意set_error_handler不会处理致命错误。您还需要使用register_shutdown_function。所以你的代码应该是这样的:

// Handles non-fatal errors
function handleError($code, $text, $file, $line) {
    var_dump($code);
    return true;
}
set_error_handler('handleError');

// Handles fatal errors
function fatalShutdown() {
    var_dump(error_get_last());
}
register_shutdown_function('fatalShutdown');

答案 1 :(得分:3)

接受的答案是错误的,因为在所有关闭时都会调用关闭函数,包括在其他地方处理的关闭,或者只是在页面成功完成时。

除了使用set_exception_handler和set_error_handler之外,我最终得到了这个:

// from http://www.php.net/manual/en/function.set-error-handler.php
define('FATAL', E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING);

register_shutdown_function('shutdown');

// Handles "fatal" errors e.g. Syntax errors
function shutdown() {
    // Only if there was an fatal error, this is run on all execution endpoints
    $error_info = error_get_last();
    if ($error_info !== null && ($error_info['type'] & FATAL)) {
        # stack trace set to empty array, as generating one here is useless
        [[ do stuff like emailing someone]]
    }
}

答案 2 :(得分:0)

在你的问题中,你告诉你正在收到致命错误。

我认为你不能抓住那些,因为它们......好......致命。

引用set_error_handler

  

以下错误类型不能   使用用户定义的函数处理:   E_ERRORE_PARSEE_CORE_ERROR,   E_CORE_WARNINGE_COMPILE_ERROR,   E_COMPILE_WARNING,以及大部分内容   E_STRICT在文件中提出   set_error_handler()被称为。{/ p>