You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP自定义错误处理函数如何忽略@控制流的错误

解决自定义错误处理函数忽略@运算符标记错误的问题

核心解决方案

在自定义错误处理函数开头添加检查逻辑:如果当前错误报告级别为0,说明该错误是被@运算符屏蔽的,直接返回true跳过后续处理。

修改后的错误处理函数代码:

function custom_error_handler($errno, $errstr, $errfile, $errline) {
    // 识别被@屏蔽的错误,直接跳过处理
    if (error_reporting() === 0) {
        return true;
    }

    $res = [
        'error_number' => $errno,
        'error_severity' => ERROR_LEVELS[$errno],
        'error_message' => $errstr,
        'error_file' => $errfile,
        'error_line' => $errline
    ];

    // 用UID记录到文件...

    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');

原理说明

@运算符会将所在行的错误报告级别临时设为0,当错误触发时,在自定义处理函数中调用error_reporting()会返回这个临时值。通过判断该值是否为0,就能精准过滤掉被@标记的错误,同时保留对其他错误的自定义处理逻辑。

更规范的替代写法

虽然@能快速屏蔽错误,但更推荐显式检查变量是否存在,避免依赖错误控制运算符,示例:

// 替代 $guid = @$_GET['guid'];
// PHP7及以上可用空合并运算符
$guid = $_GET['guid'] ?? null;

// 兼容低版本PHP的写法
$guid = isset($_GET['guid']) ? $_GET['guid'] : null;

这种写法更清晰,还能避免@屏蔽意料之外错误的问题。

内容的提问来源于stack exchange,提问作者user15538397

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 02:27:26