PHP:如何使用set_error_handler()来正确处理除通知之外的所有错误?

时间:2011-06-02 17:30:58

标签: php error-handling

我对如何正确使用set_error_handler()感到困惑,php documentation并没有真正帮助澄清。

我希望它向我发送尽可能多的错误,但通知除外。

我有以下代码

<?php

if (TRAP_ERRORS) { 
// True on production, false in development, where errors are just echoed out.
    set_exception_handler('globalExceptionHandler');
    set_error_handler('globalErrorHandler', E_USER_WARNING);
}

function globalExceptionHandler($e) {
    //log and email stuff here
}

function globalErrorHandler($errno, $errstr, $errfile, $errline) {
    switch ($errno) {
        case E_NOTICE:
        case E_USER_NOTICE:
            $errors = "Notice";
            break;
        case E_WARNING:
        case E_USER_WARNING:
            $errors = "Warning";
            break;
        case E_ERROR:
        case E_USER_ERROR:
            $errors = "Fatal Error";
            break;
        default:
            $errors = "Unknown Error";
            break;
    }

    error_log(sprintf("PHP %s:  %s in %s on line %d", $errors, $errstr, $errfile, $errline));
    $msg = "ERROR: [$errno] $errstr\r\n".
        "$errors on line $errline in file $errfile\r\n";

    sendErrorEmail($msg);
    showErrorPage();

    exit(1);
}

function sendErrorEmail($p_errorMsg) {
    // Parse and sent out the error email...
}

function showErrorPage() {
    // Redirect to an error page.
}

?>

以上是我当前的设置set_error_handler('globalErrorHandler', E_USER_WARNING);,这似乎是错误的,因为它不包含trigger_error()错误。我认为这是因为该参数应该是一个位掩码,而不仅仅是一个错误级别,但我不知道如何将其设置为最大数量的错误/信息(通知除外)。我见过使用E_ALL的示例,但这实际上直接导致包含全局错误处理程序的任何代码对我来说都是错误的。

所以,无论如何,我如何使用set_error_handler以便我的自定义错误处理程序可以处理最大量的信息(这样我可以在发生此类问题时直接获取自动电子邮件,而不必在以后查看日志)。

4 个答案:

答案 0 :(得分:14)

set_error_handler('some_handler',E_ALL & ~E_NOTICE & ~E_USER_NOTICE);

或者,如果你真的想要所有,

set_error_handler('some_handler',-1 & ~E_NOTICE & ~E_USER_NOTICE);

或者,您可以将其设置为使用所有错误,如果它们不在error_reporting(您将其设置为与上一行相同的值,也是@,则忽略它}运算符然后工作):

....
if(!($errno & error_reporting())) return true;
switch($errno){
....

答案 1 :(得分:3)

省略第二个参数或传入默认E_ALL | E_STRICT(所有错误和严格性错误,不要在此处按位OR混淆)

此外,您可以通过此处演示的Fatal errorsregister_shutdown_function()技巧“抓住”error_get_last()Handle fatal errors in PHP using register_shutdown_function()

答案 2 :(得分:1)

$error_type是使用屏蔽设置的整数。要为除E_NOTICE之外的所有内容使用错误处理程序,您可以使用以下方法之一:

set_error_handler('globalErrorHandler', E_ALL ^ E_NOTICE);
set_error_handler('globalErrorHandler', E_ALL & ~E_NOTICE);

如果您还要排除E_USER_NOTICE:

set_error_handler('globalErrorHandler', E_ALL ^ (E_NOTICE | E_USER_NOTICE));
set_error_handler('globalErrorHandler', E_ALL & ~E_NOTICE & ~E_USER_NOTICE);

请注意使用按位运算符“&amp;”,“〜”和“|”,请参阅PHP Bitwise operator manual

注意,如果在set_error_handler调用之前发生了一些错误,或者编译器错误(不太可能,但谁知道),则不会收到一些错误。请参阅PHP set_error_handler documentation

答案 3 :(得分:0)

如何使用计划任务让服务器自动向您发送错误日志文件;而不是在你的应用程序中以这种方式处理..