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等事件,如果我只是想逐步执行我的操作的话自己的代码段。
首先,Everything在Breakpoints调试部分中取消选中所有内容(包括,如果已选中):
然后将鼠标悬停在Breakpoints栏上,然后单击+:
现在添加要调试的函数的名称:
最后,在该函数中设置一个断点。现在,您将只能在该函数内触发XDebug逐步调试:
据推测,您可以根据需要添加任意数量的函数断点。有趣的是,如果您有多个具有相同名称的功能,则只需添加一次功能名称。
听起来您使用的框架是根据 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
| 归档时间: |
|
| 查看次数: |
1450 次 |
| 最近记录: |