PHP Xdebug配置导致代码异常无法被捕获从而导致500错误

3小时前 字数 1576 阅读 12 已编辑

项目环境:laravel6

有一个自定义异常MyException继承自Exception

class MyException extends Exception {

    public function __construct(string $message = "", int $code = 0) {
        parent::__construct($message, $code);
    }
}

方法调用链如下

function a -> function b

a方法调用b方法,b方法抛出MyException异常,a方法调用的地方有捕获Exception


public function a {
    try {
        $this->b();
    } catch (Exception $e) {
        ...
    }
}

最终结果是a的 try catch 并未生效,异常未被捕获,导致接口发生500错误。排查到最后原因是因为我的xdebug配置不当。

php.ini内容如下

[xdebug]                                                                           
xdebug.remote_handler="dbgp"                                                       
xdebug.client_host=localhost                                                       
xdebug.client_port=9003                                              
xdebug.idekey=phpstorm                    
xdebug.start_with_request=no                                          
xdebug.mode=debug,develop   
xdebug.var_display_max_children=128                                           
xdebug.var_display_max_data=1024       
xdebug.var_display_max_depth=15                 
xdebug.log_level = 0               
xdebug.show_error_trace=0

导致此问题的配置项是 xdebug.var_display_max_depth=15

xdebug.var_display_max_depth 控制 Xdebug 在输出变量(比如 print_r、var_dump 或错误堆栈)时,递归展开的深度。

当值很大(比如 15),如果你的异常对象里嵌套了很深的对象/数组(Laravel 的 Request、Model、Collection 都很深),

Xdebug 会在 生成错误信息/堆栈的时候 递归遍历整个对象树。

这个过程如果非常耗时,或者对象里有循环引用、资源句柄、魔术方法(get、call 等),可能触发 额外的异常 或 致命错误(如内存溢出),

这些错误发生在 try-catch 之外,就会直接 500,看起来像是“异常没被捕获”。

GPT解释是开启xdebug后,异常会被xdebug接管,它会尝试追踪异常堆栈信息,因为层级太深,导致了此错误。

GPT

1人点赞>
关注 收藏 改进 举报
0 条评论
排序方式 时间 投票
快来抢占一楼吧
请登录后发表评论
站长 @ 十七度
文章
391
粉丝
23
喜欢
198
收藏
31
排名 : 1
访问 : 166.88万
私信