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

时间:2018-08-09 03:13:23

标签: php exception visual-studio-code xdebug

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

  

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

  

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

兼容

  

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

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

我该如何实现? 谢谢。

3 个答案:

答案 0 :(得分:3)

我不知道这是否适合您的配置(我正在将PHP 7.2与WordPress配合使用),并且发现这可以防止XDebug触发所有异常,警告,通知等,如果我只是想遍历我自己的代码部分。

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

XDebug Breakpoints

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

Breakpoint bar - Add Function

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

Add breakpoint function

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

Stepping through an XDebug session without triggering every exception

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

答案 1 :(得分:0)

问题

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

  

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

     

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

由于Error层次结构不是从Exception继承的,因此使用catch(Exception $ e){...}块来处理PHP 5中未捕获的异常的代码将发现这些Error没有被这些块捕获。

需要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比以前的版本(即<= 5.6)更明确地执行错误。您使用的框架的PHP 7不支持代码,并且未处理错误。

还有其他有趣的事情:https://docs.devsense.com/en/debugging/exceptions

答案 2 :(得分:0)

就我而言,扩展程序或编辑器默认情况下都选中了EVERYTHING选项。取消选中“所有”复选框可解决此问题。