VSCODE 中的 PHP 7 Xdebug:如何忽略异常
Posted
技术标签:
【中文标题】VSCODE 中的 PHP 7 Xdebug:如何忽略异常【英文标题】:PHP 7 Xdebug in VSCODE: how to ignore exceptions 【发布时间】:2019-01-16 09:40:56 【问题描述】:我在 Visual Studio Code 中使用插件 php Debugger 来调试 PHP 代码。 PHP
发生了异常。已弃用:同名的方法 在 PHP 的未来版本中,它们的类将不再是构造函数; RecurringType 有一个不推荐使用的构造函数
或者
发生了异常。警告:AntlrLexer::matchAny() 的声明 应该兼容 BaseRecognizer::matchAny($input)
或者
发生了异常。注意:试图获取非对象的属性
这些异常是由框架生成的,所以我无法全部修复,我只想跳过所有这些异常并跳转到我的断点。
我怎样才能做到这一点? 谢谢。
【问题讨论】:
框架正在使用 PHP 7? @KhoaTruongDinh Ofcouse。这是 vTiger 7.1.0 【参考方案1】:我不知道这是否适用于您的配置(我在 WordPress 中使用 PHP 7.2),并且发现这可以防止 XDebug 触发每个异常、警告、通知等,如果我只想单步执行我自己的代码部分。
首先,取消选中 Breakpoints
调试部分中的所有内容(包括 Everything
,如果选中):
然后将鼠标悬停在Breakpoints
栏上并点击+
:
现在添加您要调试的函数的名称:
最后,在该函数中设置断点。您现在只能在该函数内触发 XDebug 单步执行:
您可以根据需要添加任意数量的自己的函数断点。有趣的是,如果您有多个同名函数,则只需添加一次函数名。
【讨论】:
工作就像一个魅力。谢谢 谢谢。我的问题是自动检查了 Everything 行,然后它卡住了数千条通知和框架警告:)【参考方案2】:在我的情况下,扩展程序或编辑器默认检查了所有选项。取消选中所有复选框解决了这个问题。
【讨论】:
【参考方案3】:问题
听起来您使用的框架是在考虑 PHP 7 之前的版本编写的。错误处理有changed,现在一个未处理的异常或Throwable
实例,更准确地说,将冒泡到使用set_exception_handler() 函数定义的异常处理函数。更大的问题是 FATAL ERROR 意味着 砰砰,进程已死,调试器无法绑定任何东西。
PHP 7 改变了 PHP 报告大多数错误的方式。不再通过 PHP 5 使用的传统错误报告机制来报告错误,现在大多数错误都是通过抛出 Error exceptions 来报告的。
与正常异常一样,这些错误异常会冒泡,直到它们到达第一个匹配的 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');
参考:http://php.net/manual/en/function.set-exception-handler.php
更多详情
那么为什么会这样呢?它与 Visual Studio 或调试器无关。 PHP 7 只是比以前的版本(即
这里还有一些有趣的东西:https://docs.devsense.com/en/debugging/exceptions
【讨论】:
以上是关于VSCODE 中的 PHP 7 Xdebug:如何忽略异常的主要内容,如果未能解决你的问题,请参考以下文章