php - 暂时停用set_error_handler

标签 php error-handling

我正在使用set_error_handler()自定义错误处理程序。在我进入“执行 buggy 脚本”部分之前,所有工作都是完美的。这个错误的脚本已集成到http://osticket.com/中。请注意,我没有集成就在ostickets的基本安装上启用了所有错误,并且得到了相同的错误,因此我知道这不是集成的缺陷。

当我运行下面显示的脚本时,我将大约200个错误写入日志并通过电子邮件发送给我。

我的愿望是在此脚本之前临时禁用set_error_handler,然后在完成后立即重新启用它。

这是如何完成的?

<?php

ini_set('display_errors', 1);
error_reporting(E_ALL);
set_error_handler("my_error_handler");

//Do normal script

//I wish to disable set_error_handler here

//Do buggy script

//I wish to re-enable set_error_handler here

//Do normal script

//Complete

function my_error_handler($e_number, $e_message, $e_file, $e_line, $e_vars) {
    $message = "An error occurred in script '$e_file' on line $e_line: $e_message (error no: $e_number)";
    syslog(LOG_INFO,'my_error_handler: '.$message);
    $e_vars='<pre>'.print_r($e_vars, 1).'</pre>';
    ob_start();
    debug_print_backtrace();
    $backtrace = ob_get_clean();
    if (in_array(substr($_SERVER['HTTP_HOST'], 0, 5), array('local', '127.0', '192.1'))) {
        echo "<div class='error'>{$message}</div><p>e_vars:</p><pre>{$e_vars}</pre><p>debug_print_backtrace:</p><pre>{$backtrace}</pre>";

    } else { 
        error_log ($message.' e_vars=> '.$e_vars, 1, 'errors@testsite.com');
        if ( ($e_number != E_NOTICE) && ($e_number < 2048)) {
            echo '<div class="error">A system error occurred. We apologize for the inconvenience.</div>';
        }

    }
}

?>

在OSTicket代码中,bootstrap.init()设置错误报告。我不希望修改原始的OSTicket代码,因为这样做会使升级到新版本更加困难。
    #Error reporting...Good idea to ENABLE error reporting to a file. i.e display_errors should be set to false
    $error_reporting = E_ALL & ~E_NOTICE;
    if (defined('E_STRICT')) # 5.4.0
        $error_reporting &= ~E_STRICT;
    if (defined('E_DEPRECATED')) # 5.3.0
        $error_reporting &= ~(E_DEPRECATED | E_USER_DEPRECATED);
    error_reporting($error_reporting); //Respect whatever is set in php.ini (sysadmin knows better??)

    #Don't display errors
    ini_set('display_errors', 0);
    ini_set('display_startup_errors', 0);

最佳答案

只需设置另一个不执行任何功能:

$my_error_handler = set_error_handler(function() { return true; });
// call OSTicket here
set_error_handler($my_error_handler);

return true更改为return false以执行PHP内部错误处理程序。

关于php - 暂时停用set_error_handler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27191499/

相关文章:

php - MYSQL PHP 帮助返回数据集

php - 如何检查 WordPress 中的缩略图?

error-handling - 我应该在日志中还是在异常中或同时在两者中打印错误消息?

.net - 在错误代码中有趣的细节处,如何捕获异常?

php - 截断字符串,但删除字符串的中间而不是结尾

php - 如何从html中获取图片的src和值,并将其存储到php变量中?

Java:使用 Junit 3 进行异常测试

java - 哪些异常需要方法的 throws 语句?

c++ - C++异常处理运行时是如何实现的?

PHP MySQL 执行多个相关查询的最佳方式