VSCODE中的PHP 7 Xdebug:如何忽略异常

Hie*_*yen 9 php exception xdebug visual-studio-code

我在Visual Studio Code中使用插件PHP Debugger调试PHP代码。PHP <= 5.6时一切正常。调试器的工作就像一个魅力。但是,当我尝试使用PHP 7调试代码时,它无法按预期工作。它没有跳到我添加的断点,我被困在thounsand,除了

发生异常。不推荐使用的:与类相同名称的方法在将来的PHP版本中将不再是构造函数;RecurringType的构造函数已弃用

要么

发生异常。警告:AntlrLexer :: matchAny()的声明应与BaseRecognizer :: matchAny($ input)兼容

要么

发生异常。注意:试图获取非对象的属性

这些异常是由框架生成的,因此我无法全部解决,我只想跳过所有这些异常,而仅跳到我的断点。

我该如何实现?谢谢。

MQu*_*gia 11

我不知道这是否适用于您的配置(我正在将PHP 7.2与WordPress配合使用),并且发现这可以防止XDebug触发每个Exception,Warning,Notice等事件,如果我只是想逐步执行我的操作的话自己的代码段。

首先,EverythingBreakpoints调试部分中取消选中所有内容(包括,如果已选中):

XDebug断点

然后将鼠标悬停在Breakpoints栏上,然后单击+

断点栏-添加功能

现在添加要调试的函数的名称:

添加断点功能

最后,在该函数中设置一个断点。现在,您将只能在该函数内触发XDebug逐步调试:

单步执行XDebug会话而不会触发每个异常

据推测,您可以根据需要添加任意数量的函数断点。有趣的是,如果您有多个具有相同名称的功能,则只需添加一次功能名称。


小智 5

在我的情况下,扩展程序或编辑器带有默认选中的 EVERYTHING 选项。取消选中 EVERYTHING 复选框解决了该问题。


Jer*_*ris 4

问题

听起来您使用的框架是根据 PHP 7 之前的版本编写的。错误处理已更改,现在未处理的异常或Throwable实例(更准确地说)将冒泡到使用set_exception_handler()函数定义的异常处理函数。更大的问题是“致命错误”意味着“砰砰”,进程已死,调试器无法绑定任何内容。

PHP 7 改变了 PHP 报告大多数错误的方式。现在,大多数错误不是通过 PHP 5 使用的传统错误报告机制来报告错误,而是通过抛出Error 异常来报告。

与正常异常一样,这些 Error 异常会冒泡,直到到达第一个匹配的 catch 块。如果没有匹配的块,则将调用使用 set_exception_handler() 安装的任何默认异常处理程序,如果没有默认异常处理程序,则异常将转换为致命错误,并像传统错误一样进行处理。

由于 Error 层次结构不是继承自 Exception,因此在 PHP 5 中使用 catch (Exception $e) { ... } 块来处理未捕获的异常的代码会发现这些错误没有被这些块捕获。需要 catch (Error $e) { ... } 块或 set_exception_handler() 处理程序>。


解决方案

那么如何跳过所有这些错误(这些错误正在转换为致命错误并停止执行)并允许它到达断点呢?通过使用 定义错误处理程序set_exception_handler()

在您的框架引导代码中注入类似的内容。请务必寻找框架可能覆盖此内容的任何地方。

function ignore_exceptions_handler($exception) {
   // Do nothing here
}

set_exception_handler('ignore_exceptions_handler');
Run Code Online (Sandbox Code Playgroud)

参考: http: //php.net/manual/en/function.set-exception-handler.php


更多细节

那么为什么会发生这种情况呢?它与 Visual Studio 或调试器无关。PHP 7 只是比以前的版本(即 <= 5.6)更明确地强制执行错误。您使用的框架包含 PHP 7 不支持的代码,并且错误未被处理。

这里还有一些有趣的事情:https ://docs.devsense.com/en/debugging/exceptions