php 自定义错误处理函数,不捕获错误控制流(带@)

wztqucjr  于 2023-09-29  发布在  PHP
关注(0)|答案(1)|浏览(138)

我自定义了错误和异常处理函数(在核心文件中),并通过以下方式设置它们:

set_error_handler('custom_error_handler');
set_exception_handler('custom_exception_handler');

在代码的其他地方,我验证了来自$_GET superglobal的请求的GET参数。即使有些GET变量可能没有被传递/设置,我也会验证并存储它们。为了避免用户错误,我将errorcontrol PHP操作符即“@”,它成功地向用户隐藏了不必要的错误。
另外,我很熟悉'@'运算符的工作原理,基本上它会在表达式中包含该运算符的行上将错误报告设置为0,然后将其重新打开。
我的目标是仍然有自定义错误处理函数(主要是为了更容易调试和错误输出,我厌倦了PHP在错误时输出的不必要的HTML标记),但保留不记录用户错误的选项,这些自定义错误处理函数捕获,即使运算符'@'用于某些表达式。
下面是更详细的问题示例:

function custom_error_handler($errno, $errstr, $errfile, $errline) {
    $res = [
        'error_number' => $errno,
        'error_severity' => ERROR_LEVELS[$errno], // custom constant to get textual severity of the error (not important)
        'error_message' => $errstr,
        'error_file' => $errfile,
        'error_line' => $errline
    ];

    // logging to file with UID...

    if(DEBUG) { // if debugging is on (false for production)
        http_response_code(500);
        print_r(json_encode($res));
    }
    else {
        http_response_code(500);
        print_r(json_encode(['error_uid' => $log_uid]));
        exit;
    }
}

set_error_handler('custom_error_handler');

echo $x;
// unset/unknown variable - should print out error and continue with execution since it is a notice (or warning I'm not sure)
$guid = @$_GET['guid']
// should not print error if '$_GET['guid']' is not set/is empty

在此设置中,两个错误都会被记录下来!
提前感谢!

13z8s7eq

13z8s7eq1#

这么做

if (error_reporting() != E_ALL) {   
    return false;
}

所以整个函数看起来就像

function custom_error_handler($errno, $errstr, $errfile, $errline) {
    $res = [
        'error_number' => $errno,
        'error_severity' => ERROR_LEVELS[$errno],
        'error_message' => $errstr,
        'error_file' => $errfile,
        'error_line' => $errline
    ];

    // logging to file with UID...

    // if suppressed error
    if (error_reporting() != E_ALL) {
        return false;
    }
        
    if(DEBUG) {
        http_response_code(500);
        print_r(json_encode($res));
    }
    else {
        http_response_code(500);
        print_r(json_encode(['error_uid' => $log_uid]));
        exit;
    }
}

set_error_handler('custom_error_handler');

echo $x;
// will print error
$guid = @$_GET['guid']
// wont print error

任何人都可以更好地学习和理解,如果他们读自己,所以:
检查this问题和最新的答案(对于PHP > 8.0.0)
以及文档中的用户通知

相关问题